sandman___ 2023-11-13 00:02 采纳率: 0%
浏览 2

(标签-单片机|关键词-1602)

为什么程序功能不实现呢,是代码的问题还是电路图连错了呢
(问题1:1602不显示 问题2:蜂鸣器持续发出响声)

/*设计一个单片机监控的电话拨号键盘,
    将电话键盘中拨出的某一电话号码,显示在LCD显示屏上。
    电话键盘共有12个键,“0”~ “9”10个数字键,
    “*”键用于实现退格功能,即清除输入的号码;
    “#”键用于清除显示屏上所有的数字显示。
    还要求每按下一个键要发出声响,以表示按下该键。*/
#include <reg51.h>
#include <string.h>
/*---------特殊位变量定义--------------*/
sbit key1=P1^0;       sbit key2=P1^1;     sbit key3=P1^2;
sbit key4=P1^3;       sbit key5=P1^4;     sbit key6=P1^5;
sbit key7=P1^6;       sbit key8=P1^7;     sbit key9=P2^7;
sbit key10=P2^5;       sbit key0=P2^6;     sbit key11=P2^4;
//key[]={1,2,3};
//unsigned char keyValue=0;
sbit E=P2^2;//1602使能位
sbit RW=P2^1;//1602读写位
sbit RS=P2^0;//1602数据/命令位
sbit beep=P3^4;//蜂鸣器
unsigned char message[5]="";//输出使用的专业字符数组
//unsigned char str[12]={1,2,3};
/*------------消抖延时函数------------*/ 
void delay(unsigned char t)  
{  
    unsigned char i;  
    for (i = 0; i < t; i++)  
        for (i = 0; i < 125; i++);  
} 
//void delay(unsigned char t)
//{
//    while(t--);
//}
/*----------------1602-----------------*/
void writecom(unsigned char com)//1602写入命令函数
{
    RS=0;
    RW=0;    
    P1=com;
    delay(100);
    E=1;
    delay(100);
    E=0;    
}
void writedat(unsigned char dat)//1602写入数据函数
{
    RW=0;
    RS=1;
    P1=dat;
    delay(100);
    E=1;
    delay(100);
    E=0;    
}
void init()//1602初始化函数
{
    writecom(0x38);
    writecom(0x0c);
    writecom(0x06);
    writecom(0x01);
}
void display(unsigned char h,unsigned char l,unsigned char *str)//1602中指定行列位置输出字符串函数
{
    unsigned char i;
    switch (h)
    {
        case 1:writecom(0x80+l);
                        for(i=0;i<strlen(str);i++)
                            writedat(str[i]);
                        break;
        case 2:writecom(0xc0+l);
                        for(i=0;i<strlen(str);i++)
                            writedat(str[i]);
                        break;                    
    }
}

void change(unsigned char temp)//把数值转变为字符串函数
{
    message[0]=temp/10+48;
    message[1]=temp%10+48;
    message[2]='\0';
}    
/*----------------独立按钮---------------*/
unsigned char keyscan(){
    unsigned char key_value = 0;  
     if (key1 == 0) { // 发现按键1被按下  
        delay(50); // 消抖  
        if (key1 == 0) { // 确定按键状态稳定后返回键值  
            key_value = 1;  
        }  
    }  
   if (key2 == 0) { // 发现按键2被按下  
        delay(50); // 消抖  
        if (key2 == 0) { // 确定按键状态稳定后返回键值  
            key_value = 2;  
        }  
    }  
      return key_value;  
    }
/* ------------声音播放函数 ------------*/  
void play_sound() {  
    beep = 0; // 打开蜂鸣器  
        beep=~beep;
    delay(50); // 播放声音持续一段时间  
    
}  

void main(){
    init();
    while(1)
    {
        // 电话键盘上的数字对应的ASCII码数组
        unsigned char num[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, '*', '#', 0};
        unsigned char key_value = 0;
        key_value=keyscan();
        // 将键值转换为对应的数字并存储在message数组中
        change(key_value);
//        message[0] = num[key_value];   
        // 添加字符串结束符  
//    message[1] = '\0'; 
        // 在第一行第一列显示message数组中的字符串
    display(1, 1, message); 
//        change(key_value);
        play_sound();
    }
}

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-13 02:03
    关注

    【以下回答由 GPT 生成】

    问题1: LCD1602显示不出任何内容。

    解决方案如下: 1. 检查电路连接是否正确。确保所有引脚都正确连接到单片机上。 2. 确认LCD1602是否已正确初始化。通常需要发送一系列命令来设置显示模式、光标位置、显示内容等。 3. 检查是否有给LCD1602供电。确认VCC和GND引脚是否正确接通电源。 4. 确认是否正确设置数据线的引脚。数据线的引脚顺序可能不同,根据具体型号的LCD1602来确定正确的引脚连接顺序。

    以下是一个示例代码,演示如何初始化和显示一段文字:

    #include <reg52.h>
    
    // 定义LCD1602所用的引脚
    sbit RS = P2^0;  // RS引脚
    sbit EN = P2^1;  // EN引脚
    sbit D4 = P2^2;  // 数据线引脚D4
    sbit D5 = P2^3;  // 数据线引脚D5
    sbit D6 = P2^4;  // 数据线引脚D6
    sbit D7 = P2^5;  // 数据线引脚D7
    
    // 函数声明
    void delay(unsigned int ms);
    void LCD_Command(unsigned char command);
    void LCD_Data(unsigned char data);
    void LCD_Init();
    void LCD_WriteString(char* string);
    
    void main()
    {
        LCD_Init();  // 初始化LCD1602
    
        // 显示一段文字
        char* text = "Hello World!";
        LCD_WriteString(text);
    
        while (1) {}  // 程序持续运行
    }
    
    // 延时函数
    void delay(unsigned int ms)
    {
        unsigned int i, j;
        for (i = 0; i < ms; i++)
            for (j = 0; j < 111; j++);
    }
    
    // 发送指令给LCD1602
    void LCD_Command(unsigned char command)
    {
        RS = 0;  // 将RS引脚设置为0,表示发送的是指令
        EN = 1;  // 将EN引脚设置为1,表示使能
    
        // 设置数据线的状态
        D7 = command >> 7;
        D6 = (command >> 6) & 1;
        D5 = (command >> 5) & 1;
        D4 = (command >> 4) & 1;
    
        EN = 0;  // 将EN引脚设置为0,表示禁止
        delay(1);  // 延时一段时间,等待指令执行
    }
    
    // 向LCD1602发送数据
    void LCD_Data(unsigned char data)
    {
        RS = 1;  // 将RS引脚设置为1,表示发送的是数据
        EN = 1;  // 将EN引脚设置为1,表示使能
    
        // 设置数据线的状态
        D7 = data >> 7;
        D6 = (data >> 6) & 1;
        D5 = (data >> 5) & 1;
        D4 = (data >> 4) & 1;
    
        EN = 0;  // 将EN引脚设置为0,表示禁止
        delay(1);  // 延时一段时间,等待数据写入
    }
    
    // 初始化LCD1602
    void LCD_Init()
    {
        LCD_Command(0x02);  // 设置为4位总线模式
        LCD_Command(0x28);  // 设置显示模式:2行,5x8字符
        LCD_Command(0x0C);  // 打开显示,关闭光标
        LCD_Command(0x06);  // 设置光标的移动方向:光标右移,字符不移动
        LCD_Command(0x01);  // 清屏
    }
    
    // 在LCD1602上显示一段文字
    void LCD_WriteString(char* string)
    {
        while (*string)
        {
            LCD_Data(*string++);
        }
    }
    

    问题2: 蜂鸣器持续发出响声。

    解决方案如下: 1. 检查蜂鸣器的连接。确保蜂鸣器的正极与单片机的IO口正确连接,负极则连接到GND。 2. 确认是否在代码中正确控制了蜂鸣器的IO口状态,即控制IO口输出高电平或低电平。

    以下是一个示例代码,演示如何控制蜂鸣器的发声状态:

    #include <reg52.h>
    
    sbit buzz = P1^0;  // 蜂鸣器控制IO口
    
    void delay(unsigned int ms);
    
    void main()
    {
        while (1)
        {
            buzz = 1;  // 使蜂鸣器发声
            delay(500);  // 延时500毫秒
            buzz = 0;  // 停止发声
            delay(500);  // 延时500毫秒
        }
    }
    
    // 延时函数
    void delay(unsigned int ms)
    {
        unsigned int i, j;
        for (i = 0; i < ms; i++)
            for (j = 0; j < 111; j++);
    }
    

    以上是对问题的解答,如果您有更多疑问或需要进一步帮助,请告诉我。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月13日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分