找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我书写的单片机20餐位呼叫器,大佬们可以在我的基础上增加代码增加功能例说是菜min...

[复制链接]
跳转到指定楼层
楼主
  //实例81:用LCD显示字符'A'
#include<reg51.h>    //包含单片机寄存器的头文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//#define LED_PORT P1
//unsigned char led_pattern = 0xFE;
//bit  led_mode = 0;  // 0-流水灯模式 1-全亮模式
#define GPIO_KEY P1
unsigned char KeyValue;        //用来存放读取到的键值

sbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚
sbit E= P2^2;     //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚
bit  buzzer_flag = 0;  //设立中断标志位为FLAG=0;
sbit BUZZER=P2^6;

sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit KEY5=P3^4;


void key();


//unsigned char i;

//void Delay500ms();

void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<120; j++);
}


//void timer0_init() {
//    TMOD = 0x01;    // 定时器0模式1
//    TH0 = 0xFC;     // 1ms定时初值
//    TL0 = 0x66;
//    ET0 = 1;        // 允许定时器0中断
//    TR0 = 1;        // 启动定时器0
//}
//
//void int0_init() {
//    IT0 = 1;        // 边沿触发
//    EX0 = 1;        // 允许外部中断0
//    EA = 1;         // 开总中断
//}
//
//void int1_init() {
//    IT1 = 1;        // 边沿触发
//    EX1 = 1;        // 允许外部中断1
//    EA = 1;         // 开总中断
//}
/*****************************************************
函数功能:延时1us
***************************************************/
void delay_us(uint i)
{
  while(--i);                  
}
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
//void delay1ms()
//{
//   unsigned char i,j;       
//         for(i=0;i<10;i++)
//          for(j=0;j<33;j++)
//           ;                 
// }
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
  {
    bit result;
        RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
    RW=1;
    E=1;        //E=1,才允许读写
        delay_us(4); //延时4微秒,给硬件反应时间       
    result=BF;  //将忙碌标志电平赋给result
        E=0;
    return result;
  }
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void Write_order_add (unsigned char dictate)
{   
    while(BusyTest()==1); //如果忙就等待
         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
         RW=0;   
         E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
     delay_us(2);  //延时4微秒,给硬件反应时间                      // 就是让E从0到1发生正跳变,所以应先置"0"
         P0=dictate;            //将数据送入P0口,即写入指令或地址
         delay_us(4); //延时4微秒,给硬件反应时间
         E=1;                   //E置高电平
         delay_us(4);  //延时4微秒,给硬件反应时间//空操作四个机器周期,给硬件反应时间
         E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
    while(BusyTest()==1);  
          RS=1;           //RS为高电平,RW为低电平时,可以写入数据
          RW=0;
          E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
                       // 就是让E从0到1发生正跳变,所以应先置"0"
          P0=y;           //将数据送入P0口,即将数据写入液晶模块
        delay_us(4);   //延时4微秒,给硬件反应时间
          E=1;          //E置高电平
        delay_us(4);  //延时4微秒,给硬件反应时间
         E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInit(void)
{
   delay_ms(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
   Write_order_add(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
   delay_ms(5);   //延时5ms 
   Write_order_add(0x38);
   delay_ms(5);
   Write_order_add(0x38);
   delay_ms(5);
   Write_order_add(0x0E);  //(0x0c、0x0d、0x0e、0x0f显示模式设置:显示开,有光标,光标闪烁
   delay_ms(5);
   Write_order_add(0x06);  //(0x04、0x06、0x07显示模式设置:光标右移,字符不移
   delay_ms(5);
   Write_order_add(0x01);  //清屏幕指令,将以前的显示内容清除
   delay_ms(5);
}
void main(void)            //主函数
{   
        unsigned int i;
//                timer0_init();
//       int0_init();
//                int1_init();
            LcdInit();
//        LED_PORT = 0xFF;                 //调用LCD初始化函数  
while(1) {
                if(buzzer_flag){
                BUZZER = ~BUZZER;
                        delay_ms(1);
                        i++;
                        if(i >= 200) {
                        i = 0;
                        buzzer_flag = 0;
                        }
                }
                key();
    }
}                                                                               

//void timer0_isr() interrupt 1 {
//    TH0 = 0xFC;
//    TL0 = 0x66;
//
//
//    // 定时器中断服务程序
//}

//void int1_isr() interrupt 2 {
////    LED_PORT = 0x1F;  // 所有LED亮           F8
////    delay_ms(2000);   // 保持亮1秒
////    LED_PORT = 0xFF;  // LED熄灭
////        Write_order_add(0xC7);
////        WriteData('L');              //将字符常量'A'写入液晶模块
////    WriteData('O');
////    WriteData('S');
////    WriteData('E');
////     WriteData(' ');
////         WriteData(' ');
//}
void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//读取按键是否按下
        {
                delay_ms(20);//延时10ms进行消抖
                if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
                {       
                        //测试列
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=1;break;
                                case(0X0b):        KeyValue=2;break;
                                case(0X0d): KeyValue=3;break;
                                case(0X0e):        KeyValue=4;break;
                        }
                        //测试行
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
                        {
                                delay_ms(20);
                                a++;
                        }
                }
        }
}

void LCD_Dis(unsigned char p1, unsigned char p2)
{
        buzzer_flag = 1;
        Write_order_add(0xC7);
    WriteData(p1);              //将字符常量'A'写入液晶模块
        WriteData(p2);              //将字符常量'A'写入液晶模块
}
void key()
{
        KeyDown();
        switch(KeyValue){
                case 1:         LCD_Dis('1', ' '); break;
                case 2:         LCD_Dis('2', ' '); break;
                case 3:         LCD_Dis('3', ' '); break;
                case 4:         LCD_Dis('4', ' '); break;
                case 5:         LCD_Dis('5', ' '); break;
                case 6:         LCD_Dis('6', ' '); break;
                case 7:         LCD_Dis('7', ' '); break;
                case 8:         LCD_Dis('8', ' '); break;
                case 9:         LCD_Dis('9', ' '); break;
                case 10: LCD_Dis('1', '0'); break;
                case 11: LCD_Dis('1', '1'); break;
                case 12: LCD_Dis('1', '2'); break;       
                case 13: LCD_Dis('1', '3'); break;
                case 14: LCD_Dis('1', '4'); break;
                case 15: LCD_Dis('1', '5'); break;
                case 16: LCD_Dis('1', '6'); break;               
        }
        KeyValue = 0;
        if(!KEY1)
        {       
                delay_ms(20);
                while(!KEY1);
                buzzer_flag = 1;
                Write_order_add(0xC7);
            WriteData('1');              //将字符常量'A'写入液晶模块
                WriteData('7');              //将字符常量'A'写入液晶模块

        }
        if(!KEY2)
        {       
                delay_ms(20);
                while(!KEY2);
                buzzer_flag = 1;
                Write_order_add(0xC7);
            WriteData('1');              //将字符常量'A'写入液晶模块
                WriteData('8');              //将字符常量'A'写入液晶模块
        }   
        if(!KEY3)
        {       
                delay_ms(20);
                while(!KEY3);
                buzzer_flag = 1;
                Write_order_add(0xC7);
                WriteData('1');              //将字符常量'A'写入液晶模块
                WriteData('9');              //将字符常量'A'写入液晶模块
        }
        if(!KEY4)
        {
                delay_ms(20);
                while(!KEY4);
                buzzer_flag = 1;
                Write_order_add(0xC7);
                WriteData('2');              //将字符常量'A'写入液晶模块
                WriteData('0');              //将字符常量'A'写入液晶模块
        }


        if(!KEY5)
        {
                delay_ms(20);
                while(!KEY5);
                buzzer_flag = 0;
                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
            WriteData(' ');              //将字符常量'A'写入液晶模块
            WriteData(' ');
        }
//        if(!KEY11)
//        {
//                delay_ms(20);
//                while(!KEY11);
//                buzzer_flag = 1;
//                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
//            WriteData('9');              //将字符常量'A'写入液晶模块
//                WriteData(' ');              //将字符常量'A'写入液晶模块
//        }
//        if(!KEY12)
//        {
//                delay_ms(20);
//                while(!KEY12);
//                buzzer_flag = 1;
//                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
//            WriteData('1');              //将字符常量'A'写入液晶模块
//                WriteData('0');              //将字符常量'A'写入液晶模块
//        }
//        if(!KEY13)
//        {
//                delay_ms(20);
//                while(!KEY13);
//                buzzer_flag = 1;
//                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
//            WriteData('1');              //将字符常量'A'写入液晶模块
//                WriteData('1');              //将字符常量'A'写入液晶模块
//        }
//        if(!KEY14)
//        {
//                delay_ms(20);
//                while(!KEY14);
//                buzzer_flag = 1;
//                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
//            WriteData('1');              //将字符常量'A'写入液晶模块
//                WriteData('2');              //将字符常量'A'写入液晶模块
//        }
//        if(!KEY15)
//        {
//                delay_ms(20);
//                while(!KEY15);
//                buzzer_flag = 1;
//                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
//            WriteData('1');              //将字符常量'A'写入液晶模块
//                WriteData('3');              //将字符常量'A'写入液晶模块
//        }
//        if(!KEY16)
//        {
//                delay_ms(20);
//                while(!KEY16);
//                buzzer_flag = 1;
//                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
//            WriteData('1');              //将字符常量'A'写入液晶模块
//                WriteData('4');              //将字符常量'A'写入液晶模块
//        }
//        if(!KEY17)
//        {
//                delay_ms(20);
//                while(!KEY17);
//                buzzer_flag = 1;
//                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
//            WriteData('1');              //将字符常量'A'写入液晶模块
//                WriteData('5');              //将字符常量'A'写入液晶模块
//        }
//        if(!KEY18)
//        {
//                delay_ms(20);
//                while(!KEY18);
//                buzzer_flag = 1;
//                Write_order_add(0xC7);       //将显示地址指定为第1行第8列
//            WriteData('1');              //将字符常量'A'写入液晶模块
//                WriteData('6');              //将字符常量'A'写入液晶模块
//        }

}

//void int0_isr() interrupt 0 {
////    buzzer_flag = ~buzzer_flag;// 切换蜂鸣器状态
////    LED_PORT = 0x7F;  // 所有LED亮        FB
////    delay_ms(2000);   // 保持亮1秒
////    LED_PORT = 0xFF;  // LED熄灭                        
////        Write_order_add(0xC7);       //将显示地址指定为第1行第8列
////    WriteData('S');              //将字符常量'A'写入液晶模块
////    WriteData('U');
////    WriteData('C');
////    WriteData('C');
////    WriteData('E');
////    WriteData('S');
//   
//        //字符的字形点阵读出和显示由液晶模块自动完成
//}


//
//void Delay500ms()                //@12.000MHz
//{
//        unsigned char i, j, k;
//        i = 4;
//        j = 205;
//        k = 187;
//        do
//        {
//                do
//                {
//                        while (--k);
//                } while (--j);
//        } while(--i);
//}






屏幕截图 2025-07-10 144529.png (139.92 KB, 下载次数: 0)

屏幕截图 2025-07-10 144529.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1152291 发表于 2025-7-10 14:47 | 只看该作者
大家可以根据我的代码设置,我想在LCD1602上面显示汉字,现在是显示不了的哦,所以想请大佬给我们设置可以给,就是可以显示汉字的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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