按鍵掃描:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define key0 P3^1
#define key1 P3^0
#define key2 P3^2
#define key3 P2^3
#define key4 P2^4
#define key5 P2^5
extern void delay1ms(uint time);
uchar keyscan(void)
{
uchar keyval;
P3=1;
if(P3!=0xff)
{
delay1ms(10);//延時10ms進行消抖
if(P3!=0xff)
{
if(key0==0) keyval=0;
if(key1==0) keyval=1;
if(key2==0) keyval=2;
if(key3==0) keyval=3;
if(key4==0) keyval=4;
if(key5==0) keyval=5;
}
}
return(keyval);
}
1602顯示:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
extern uchar keyscan(void);
uchar gMode; // 1是手動模式,2是定時模式,3是光控模式
extern void delay1ms(uint time);
sbit LcdRs_P = P2^6; // 1602液晶的RS管腳
sbit LcdRw_P = P2^5; // 1602液晶的RW管腳
sbit LcdEn_P = P2^7; // 1602液晶的EN管腳
void LcdWriteCmd(uchar cmd) // 1602液晶寫命令函數,cmd就是要寫入的命令
{
LcdRs_P = 0;
LcdRw_P = 0;
LcdEn_P = 0;
P0=cmd;
delay1ms(2);
LcdEn_P = 1;
delay1ms(2);
LcdEn_P = 0;
}
void LcdWriteData(uchar dat)
{
LcdRs_P = 1;
LcdRw_P = 0;
LcdEn_P = 0;
P0=dat;
delay1ms(2);
LcdEn_P = 1;
delay1ms(2);
LcdEn_P = 0;
}
void LcdGotoXY(uchar line,uchar column) // 液晶光標定位函數
{
// 第一行
if(line==0)
LcdWriteCmd(0x80+column);
// 第二行
if(line==1)
LcdWriteCmd(0x80+0x40+column);
}
void LcdPrintStr(uchar *str) // 液晶輸出字符串函數
{
while(*str!='\0')
LcdWriteData(*str++);
}
void LcdInit() // 1602液晶初始化函數
{
LcdWriteCmd(0x38); // 16*2顯示,5*7點陣,8位數據口
LcdWriteCmd(0x0C); // 開顯示,不顯示光標
LcdWriteCmd(0x06); // 地址加1,當寫入數據后光標右移
LcdWriteCmd(0x01); // 清屏
}
void LcdPrintMode(uchar num) // 顯示模式
{
switch(num)
{
case 1: LcdPrintStr("Manual"); break;
case 2: LcdPrintStr("Timing"); break;
case 3: LcdPrintStr("Liging"); break;
default: break;
}
}
void LcdShowInit() // 液晶顯示內容的初始化
{ gMode=keyscan();
LcdGotoXY(0,0);
LcdPrintMode(gMode);
}
主函數:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
extern uchar keyscan(void);
extern void init(void);
extern void LcdInit(void);
extern void LcdShowInit(void);
extern void LcdPrintMode(uchar keyval);
extern void send_infrared(uchar keyval);
void delay1ms(uint time) {
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
void main()
{
uchar keyval;
init(); // 發射模塊初始化
LcdInit(); // 執行液晶初始化
LcdShowInit(); // 液晶顯示內容的初始化
while(1)
{
keyval=keyscan();
while(keyscan());
if(keyval) {send_infrared(keyval);
LcdShowInit();
}
}
}
|