⑴ c語言編寫鍵盤監控器方法
鍵控程序簡單事例:#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
/*======== ALL VAR==============*/
int bleft=10;
int width=52;
int height=20;
/*=========About Location===========*/
typedef struct
{
int x, y;
int xv, yv;
}Location;/*=============About Welcome=============*/
void menu()
{ printf(" welcom to coming\n");
printf(" =======================================================\n");
printf(" ! In the game please press ESc to quit! !\n");
printf(" ! Enter the game?(Y/N) !\n");
printf(" =======================================================\n");
}
/*=========About border==========*/
void bianjie()
{
int i;
for(i=0;i<bleft;i++)
printf(" ");
for(i=0;i<width;i++)
{ printf("=");
}
for(i=0;i<height;i++)
{ gotoxy(bleft,i);
printf("!");
}
for(i=0;i<height;i++)
{ gotoxy(width+bleft,i);
printf("!");
}
for(i=1;i<width;i++)
{ gotoxy(bleft+i,height-1);
printf("=");
}
}
/*==========About pro things===========
void things()
{
}*/
/*===========About Oprtion=============*/
void xing()
{
int i,key;
Location shili;
shili.x=bleft+1;
shili.y=1;
shili.xv=5;
shili.yv=5;
while(1)
{
key=bioskey(0);
if(key==ESC)/**/
break;
else if(key==UP)
{
for(i=0;i<shili.yv;i++)
{
if(shili.y-shili.yv>1)
{
shili.y--;
gotoxy(shili.x,shili.y+1);
printf(" ");
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
}
else {
if(shili.y>1)
{
shili.y--;
gotoxy(shili.x,shili.y+1);
printf(" ");
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
}
else { shili.y++;
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
gotoxy(shili.x,shili.y-1);
printf(" ");
}
}
}
}
else if(key==DOWN)
{
for(i=0;i<shili.yv;i++)
{
if(shili.y+shili.yv<height)
{
shili.y++;
gotoxy(shili.x,shili.y-1);
printf(" ");
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
}
else {
if(shili.y<height)
{
shili.y++;
gotoxy(shili.x,shili.y-1);
printf(" ");
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
}
else { shili.y--;
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
gotoxy(shili.x,shili.y+1);
printf(" ");
}
}
}
}
else if(key==LEFT)
{
for(i=0;i<shili.xv;i++)
{
if(shili.x-shili.xv>bleft)
{
shili.x--;
gotoxy(shili.x+1,shili.y);
printf(" ");
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
}
else {
if(shili.x>bleft)
{
shili.x--;
gotoxy(shili.x+1,shili.y);
printf(" ");
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
}
else { shili.x++;
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
gotoxy(shili.x-1,shili.y);
printf(" ");
}
}
}
}
else if(key==RIGHT)
{
for(i=0;i<shili.xv;i++)
{
if(shili.x+shili.xv<width+bleft)
{
shili.x++;
gotoxy(shili.x-1,shili.y);
printf(" ");
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
}
else {
if(shili.x<width+bleft)
{
shili.x++;
gotoxy(shili.x-1,shili.y);
printf(" ");
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
}
else { shili.x--;
gotoxy(shili.x,shili.y);
printf("%c\b", 2);
gotoxy(shili.x+1,shili.y);
printf(" ");
}
}
}
}
}}
/**********************************/
void main()
{ char ch;
clrscr();
menu();
ch=getch();
if(ch=='N'||ch=='n')
return;
else if(ch=='Y'||ch=='y')
{ clrscr();
bianjie();
xing();
}
}C語言獲取鍵值函數事例:/*函數名稱: bioskey
函數原型: int bioskey(int cmd)
函數功能: 讀取鍵盤值
函數返回: cmd=0:返回一個鍵盤值(ascii值放在低位,掃描碼放在高位),若無按鍵,一直等
cmd=1:查詢鍵盤是否按下:0-無鍵按下,非0-有鍵按下
cmd=2:返回控制鍵狀態,返回值保存在低8位中
0-右邊的shift鍵按下 5-已打開Scroll_Lock
1-左邊的shift鍵按下 6-已打開Num_Lock
3-Ctrl鍵按下 7-已打開Caps_Lock
4-Alt鍵按下 8-已打開Insert
參數說明:
所屬文件: <bios.h>*/
#include <stdio.h>
#include <bios.h>
#include <ctype.h>
int main()
{
int key, shift;
int lastshift;
while (1)
{
shift=bioskey(2);
if(shift!=lastshift)
printf("Shift=0x% 02x\n",shift);
if(bioskey(1))
{
key=bioskey(0);
if((key&0xFF)=='q')
break;
printf("Key=0x% 04x",key);
}
lastshift=shift;
}
return 0;
}文件存在性判斷事例:#include <stdio.h>
#include <io.h>
int file_exists(char *filename);
int main()
{
printf("Does myfile.FIL exist: %s",file_exists("myfile.FIL") ? "YES" : "NO");
getch();
return 0;
}
int file_exists(char *filename)
{
return (access(filename,0)==0);
} 如還有疑問,請追加!
⑵ 如何用C語言控制報警器報警的頻率,求解,希望詳細一點!
如果需要報警器鳴叫和停止鳴叫兩個狀態都按照精確時間來控制的話需要用到中斷,如果不需要的話直接用計數及可以搞定
具體實現方法是把兩種狀態的時間先計算好,然後開中斷並計數,可以在中斷中進行報警器使能的查詢,如果發現鳴叫開始的話即使能開始,就進行計數減一,當計數值為零的時候就將報警器的使能關斷這樣就可以控制報警器的開通時間
另一種是直接在程序中進行計數根據晶元的主頻和代碼的周期時間值進行開通和關斷的控制,也是通過查詢狀態的方式進行計數值的加減,最後進行狀態轉換就好了
⑶ 單片機溫度報警器的溫度上下限按鍵調控的C語言程序怎麼編
溫度報警器就是需要溫度感測器不停地對監控的對象進行檢測,例如pt100溫度感測器,pt100感測器是不同溫度下,阻值會不同,在同一溫度下,阻值是相同的。根據這個原理通過電路轉換成電壓,然後模擬量轉換成數字量輸入到單片機,單片機根據讀取到的電壓值判斷實際溫度值,然後根據設定的報警值比較,如果超過 就進行報警動作。
在實際設計過程中那個報警溫度的設定,可以直接對那個變數進行加減的,例如
void actfuntion(unsigned char temp)
{
temp++;
}
然後在檢測到按鍵有電平跳變的時候,就調用這個含參子函數對定義的溫度設定值進行加操作,減操作也是一樣,還可以在調用的後面進行最大值或者最小值的判斷。
如果覺得這樣一下一下的按太麻煩了,可以對按鍵進行長按連續觸發進行判斷,就是在定時器里進行判斷按下時間,然後不停的調用這個子函數。
當然這個設定值是需要考慮掉電保存的,或者是按鍵保存。可以在設定好溫度值之後,在按下其他的按鍵,進行把溫度設定值 保存到單片機內部eeprom就可以了,不需要保存太多數據的情況下,現在市面上很多單片機都有的內部eeprom就夠用的了,不需要進行外部擴展。
然後在單片機上電,也就是主函數的開頭進行讀取eeprom中保存的設定值。
⑷ 用C語言編寫,兩個按鈕控制蜂鳴器工作。按鈕1按下,蜂鳴器以500Hz的頻率工作。按鈕2按下,蜂鳴器停止工作
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitBELL=P1^0;//定義蜂鳴器
sbitkey1=P1^1;//定義按鍵
sbitkey2=P1^2;//定義按鍵
uintnum;
/*1ms廷時*/
voiddelay_ms(uintz)
{
uinti,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
/*定時器初始化*/
voidinit_timer0()
{
TMOD=0x01;
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
EA=0;
ET0=1;
TR0=1;
}
voidmain()
{
BELL=0;
init_timer0();
while(1)
{
if(key1==0)
{
delay_ms(10);//延時消抖
if(key1==0) //再次判斷按鍵是否真的被按下
{
while(key1==0);//等待釋放按鍵
EA=1; //開啟總中斷
}
}
if(key2==0)
{
delay_ms(10);//延時消抖
if(key2==0) //再次判斷按鍵是否真的被按下
{
while(key2==0); //等待釋放按鍵
EA=0; //關閉總中斷
BELL=0; //關閉蜂鳴器
}
}
}
}
voidtimer0()interrupt1
{
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;//中斷計時2ms(500Hz),之所以用中斷是因為定時比較准確想改延時就把裡面的2000改掉,這個數除以1000得的數就是多少毫秒
num++;
if(num==1) //讓蜂鳴器工以500Hz頻率工作
{
num=0;
BELL=~BELL;
}
}