找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1188|回复: 0
打印 上一主题 下一主题
收起左侧

请问下面这个单片机程序为什么按键没有显示?

[复制链接]
跳转到指定楼层
楼主
ID:880793 发表于 2021-4-10 12:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按键扫描:
#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();   
}

}
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表