?? 液晶顯示1602與遙控程序演示!.txt
字號:
液晶顯示1602與遙控程序演示!
//遙控帶液晶顯示程序,已經調試完畢2002/10/30
//并可顯示時鐘
//若遙控接收不到,修改脈寬值即可
//
//-----------------------------------------------
//http://www.mcu123.com
//Email:ycxms88@163.com
//作者:Mingtree
//-----------------------------------------------
#include <reg51.h>
#include<intrins.h>
#include<absacc.h>
//變量類型標識的宏定義,
#define uchar unsigned char
#define uint unsigned int
#define DEDA 20
unsigned char deda=0;
// 1602 控制引腳定義,
sbit RS = P0^0;
sbit RW = P0^1;
sbit Elcm =P0^2;
#define DATAPORT P1 // 數據端口
#define busy 0x80 //用于檢查寫忙信號
//外鍵控制(本程序未用,現在用遙控控制)
sbit act=P2^1; /*加鍵*/
sbit deb=P2^0; /*減鍵*/
sbit cong=P2^2; /*功能鍵*/
char data led6[8];/*六位顯示緩沖區*/
code char love[]="I LOVE YOU ";
code char time[]="0123456789ABCDEF:MinHour ";
unsigned char hour=0,min=0,sec=0;
bit menu=0;
bit up=0;
bit dw=0;
#define temp1 DBYTE[0x50]
#define temp2 DBYTE[0x51]
#define temp3 DBYTE[0x52]
#define temp4 DBYTE[0x53]
#define temp5 DBYTE[0x54]
//遙控
unsigned char yt; //中斷次數
bit start=0; //起碼標志
bit h=0; //解碼標志
unsigned char da=0; //暫存數據
unsigned char gt=0,gv=0; //
//
void delay400ms(void);
void delay5ms(void);
void lcdreset( void ); //LCD RESET
void WaitForEnable( void ); //忙信號檢測
void lcdwrite_c( uchar CMD,uchar AttribC );//
void DispOneChar(uchar x,uchar y,uchar Wdata);//顯示一個字符
void LocateXY( char posx,char posy);
void LcdWrite_D( char dataW ) ; //寫一個數據
void yk(void);
/*鍵盤檢測*/
void acct_1(void);
unsigned char conh=0; /*功能鍵鍵值*/
void key_hit(unsigned char add3);
void delay(void);
/*定時初始化------------*/
void init_timer()
{
TMOD=0x11;
TH0=0x4c;
TL0=0x00;
IP=0x10;
IE=0X82;
TR0=1;
IT0=1; //邊沿觸發方式
EX0=1; //INT0
}
/*------------------------*/
/*----------顯示緩沖區放數子程序--------------*/
void gift_in(void){
if(conh==0){
led6[0]=hour/10;
led6[1]=hour%10;
led6[2]=16;
led6[3]=min/10;
led6[4]=min%10;
led6[5]=16;
led6[6]=sec/10;
led6[7]=sec%10;
}
else if(conh==1){
led6[0]=17;
led6[1]=18;
led6[2]=19;
led6[3]=16;
led6[4]=min/10;
led6[5]=min%10;
led6[6]=24;
led6[7]=24;
}
else{
led6[0]=20;
led6[1]=21;
led6[2]=22;
led6[3]=23;
led6[4]=16;
led6[5]=hour/10;
led6[6]=hour%10;
led6[7]=24;
}
}
/*----------時間判斷子程序--------------*/
conv()
{
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24) hour=0;
gift_in();
}
/*-----------中斷服務程序-------------*/
void time8()interrupt 1 using 3
{
TH0=0x4c;
TL0=0x00;
deda++;
if(deda==DEDA)
{
sec++;deda=0;
}
conv();
}
/*-----------送顯子程序-------------*/
void disp1(uchar x,uchar y) {
unsigned char *pd;
unsigned char*kt;
unsigned char b;
kt=&led6[0]; /*送led的首地址給指針KT*/
for(b=0;b<8;b++){ /* 顯示六位*/
pd=&time[*kt]; /*查表---送要顯示的碼給指針pd*/
kt++; /*緩沖區加1*/
DispOneChar(x,y,*pd);
x++; //顯示位置X
}
}
/*------------------------*/
/*=======================================================
顯示字符串
=======================================================*/
void disp(uchar x,uchar y,char *ptr) {
uchar i,l=0;
while (ptr[l] >31){l++;};
for (i=0;i<l;i++) {
DispOneChar(x++,y,ptr[i]);
if ( x == 16 ){
x = 0; y ^= 1;
}
}
}
/*=======================================================
按指定位置顯示數出一個字符
=======================================================*/
void DispOneChar(uchar x,uchar y,uchar Wdata) {
LocateXY( x, y ); // 定位顯示地址
LcdWrite_D( Wdata ); // 寫字符
}
/*=======================================================
顯示光標定位
=======================================================*/
void LocateXY( char posx,char posy) {
uchar temp;
temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
lcdwrite_c(temp,0);
}
//初始化
void lcdreset(void){
lcdwrite_c(0x38, 0); //顯示模式設置(不測試忙信號)共三次
delay5ms();
lcdwrite_c(0x38, 0);
delay5ms();
lcdwrite_c(0x38, 0);
delay5ms();
lcdwrite_c( 0x38, 1);
lcdwrite_c( 0x08, 1);
lcdwrite_c( 0x01, 1);
lcdwrite_c( 0x06, 1);
lcdwrite_c( 0x0c, 1);
}
/*=======================================================
寫控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void lcdwrite_c( uchar CMD,uchar AttribC ) {
if (AttribC) WaitForEnable(); // 檢測忙信號?
RS = 0; RW = 0; _nop_();
DATAPORT =CMD; _nop_(); // 送控制字子程序
Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允許脈沖信號
}
/*=======================================================*/
/*=======================================================
當前位置寫字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWrite_D( char dataW ) {
WaitForEnable(); // 檢測忙信號
RS = 1; RW = 0; _nop_();
DATAPORT = dataW; _nop_();
Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允許脈沖信號
}
/*=======================================================
正常讀寫操作之前必須檢測LCD控制器狀態: CS=1 RS=0 RW=1
DB7: 0 LCD控制器空閑; 1 LCD控制器忙
========================================================*/
void WaitForEnable( void ) {
DATAPORT = 0xff;
RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();
while( DATAPORT & busy );
Elcm = 0;
}
// 短延時
void delay5ms(void)
{
uint i = 5552;
while(i--);
}
//長延時
void delay400ms(void)
{
uchar i = 5;
uint j;
while(i--)
{
j=7269;
while(j--);
};
}
/*-------延時---------------*/
void delay(void){
int r;
int e;
for(r=0;r<500;r++){ /*外層循環*/
_nop_ (); /* delay for hardware */
_nop_ (); /* delay for hardware */
_nop_ (); /* delay for hardware */
for(e=0;e<3;e++){ /*內層循環*/
_nop_ (); /* delay for hardware */
_nop_ (); /* delay for hardware */
_nop_ (); /* delay for hardware */
_nop_ (); /* delay for hardware */
_nop_ (); /* delay for hardware */
}
}
}
/*----------功能鍵識別子程序--------------*/
void acct_1(void){
tf: _nop_();
if(menu){
menu=0;
conh++;
if(conh==3) conh=0;
}
if(conh==1){key_hit(min); //低位設置
conv();
disp1(3,0);
delay();
}
if(conh==2){key_hit(hour); //高位設置
conv();
disp1(3,0);
delay();
}
/* if(conh==3){key_hit(thtl) //顯示高位,低位
conv();
delay();
delay();
delay();
delay();
delay();
}
if(conh==4){key_hit(save);
conv();
disp();
delay();
}*/
yk();
if(!conh==0) goto tf; /*功能設置完畢?未設置則繼續執行功能鍵處理*/
}
/*-----------加減鍵處理子程序-------------*/
/*按鍵處理*/
void key_hit(unsigned char add3)
{
if(dw){
dw=0; /*減鍵*/
add3--;
if(add3>=60) add3=0;
if(conh==1) min=add3;
if(conh==2) hour=add3;
conv();
disp1(3,0);
}
if(up){ /*加鍵*/
up=0; /*減鍵*/
add3++;
if(add3==60) add3=0;
if(conh==1) min=add3;
if(conh==2) hour=add3;
conv();
disp1(3,0);
}
if(conh==1) min=add3;
if(conh==2) hour=add3;
}
//遙控碼識別
void yk(void){
if(temp2==0xe2){
if(temp4==0xf1){
if(temp3==0x2c){
if(temp5==0x16){ //功能鍵
menu=1;
temp3=0;
temp5=0;
}
}
if(temp3==0x44){
if(temp5==0x22){ //加鍵
up=1;
temp3=0;
temp5=0;
}
}
if(temp3==0x54){
if(temp5==0x2a){ //減鍵
dw=1;
temp3=0;
temp5=0;
}
}
}
}
}
//遙控中斷除理
void int0a()interrupt 0 using 2
{
// TH1=TL1=0;
//TR0=1; //啟動定時器
yt++; //中斷次數
if(yt==1)
{
TH1=TL1=0;
TR1=1; //啟動定時器
}
if(yt==2)
{
temp1=TH1; //為起始
TH1=TL1=0;
if(temp1>=0x1f)
{ //大于8ms
start=1; //置起碼標志
}
else
{
start=0;
yt=0;
TR1=0;
}
}
else
{
if(start==1)
{ //是起始才可以繼續接收
temp1=TH1; //裝入上次定時值
TH1=TL1=0; //重新計數
if(temp1>=0x05)
{ //大于1.2ms
h=1;
}
else if(temp1>=0x01)
{ //大于0.25ms
h=0;
}
da*=2;
if(h) da++;
gt++;
if(gt==8)
{ //讀8位
gt=0;gv++;
if(gv==1) temp2=da;
if(gv==2) temp3=da;
if(gv==3) temp4=da;
if(gv==4)
{temp5=da;
gv=0;
start=0;
yt=0;
TR1=0;
}
da=0;
}
}
}
}
/*------------------------*/
void main(void)
{
init_timer();
led6[0]=0;
led6[1]=2;
led6[2]=2;
led6[3]=2;
led6[4]=2;
led6[5]=2;
lcdreset(); //初始化
delay400ms();
disp1(3,0);
disp(2,1,love); //顯示
delay400ms();
// DispOneChar(0,1,time[1]);
while(1)
{
delay400ms();
disp1(3,0);
acct_1();
yk();
}
}
各位見笑了.
工程下載
歡迎進入超前MCU技術論壇對液晶顯示1602與遙控程序演示!進行討論!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -