久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2165|回復: 1
收起左側

去除delay()函數的4×4行列矩陣鍵單片機程序

[復制鏈接]
ID:66287 發表于 2018-11-30 14:19 | 顯示全部樓層 |閱讀模式
  1. /*************************************************************************
  2. 工程名:4×4行列矩陣鍵盤
  3. 作  者:老芹
  4. 用定時器0設置一個基準計時器,代替CPU軟件延時,從而解放CPU,避免空耗時
  5. *************************************************************************/
  6. #include<STC15F2K60S2.h>
  7. #include"LCD1602.h"
  8. #include"hardware.h"
  9. #include"intrins.h"

  10. #define  uchar unsigned char
  11. #define  uint unsigned int
  12. uchar code tab[4][4] = {           {'1','2','3','A'},    //0~9,A~D,*,#的鍵值
  13.                                                   {'4','5','6','B'},
  14.                                                   {'7','8','9','C'},
  15.                                                   {'*','0','#','D'}
  16.                                                                                             };      
  17. uchar temp;  
  18. uchar Timer_10ms_con=0;          //10ms定時計數控制                                                                                       
  19. uchar Timer_10ms=0;              //10ms定時計數
  20. extern LCD_int();                //初始化LCD
  21. void Timer0_Init();              //定時器0初始化
  22. void LCD_write_com(uchar com);   //寫一個字節數據到LCD

  23. uchar keyscan()                  //鍵盤掃描
  24.    {         
  25.         uchar key_H,key_L,key_temp,key,row,column;
  26.         key_data = 0xf0;             //高四位做輸入
  27.         if(key_data == 0xf0)         //沒有按鍵動作
  28.             {
  29.           key = 0;
  30.           return(key);
  31.           }         
  32.         while(1)
  33.          {  
  34.          if(Timer_10ms<5)       //替代常規10ms軟件延時,如delay(10)類;
  35.                  {
  36.                  Timer_10ms_con=1;
  37.                  key = 0;
  38.                  return(key);
  39.                  }
  40.         Timer_10ms=0;          //10ms到
  41.         Timer_10ms_con=0;      //定時計數控制復位
  42.         if(key_data==0xf0)     //是干擾,退出
  43.           {
  44.            key = 0;
  45.            return(key);
  46.           }

  47.         key_H = key_data;      
  48.         key_data = 0x0f;       //低四位做輸入      
  49.         _nop_();               //STC等高速51單片機,在端口置"1",后,如果立即讀數據,會讀出不確定值,所以加入短暫延時
  50.         _nop_();
  51.         key_L = key_data;
  52.         while(key_data!=0x0f); //按鍵是否放開      
  53.                key_temp = key_H|key_L;               
  54.                 switch(key_temp)   
  55.                   {
  56.                   case 0x7e:row=3;column=0;break;  //顯示"*"
  57.                   case 0x7b:row=3;column=2;break;  //顯示"#"
  58.                   case 0xe7:row=0;column=3;break;  //顯示"A"
  59.                   case 0xd7:row=1;column=3;break;  //顯示"B"
  60.                   case 0xb7:row=2;column=3;break;  //顯示"C"
  61.                   case 0x77:row=3;column=3;break;  //顯示"D"
  62.                   case 0x7d:row=3;column=1;break;  //顯示"0"
  63.                   case 0xee:row=0;column=0;break;  //顯示"1"
  64.                   case 0xed:row=0;column=1;break;  //顯示"2"
  65.                   case 0xeb:row=0;column=2;break;  //顯示"3"
  66.                   case 0xde:row=1;column=0;break;  //顯示"4"
  67.                   case 0xdd:row=1;column=1;break;  //顯示"5"
  68.                   case 0xdb:row=1;column=2;break;  //顯示"6"
  69.                   case 0xbe:row=2;column=0;break;  //顯示"7"
  70.                   case 0xbd:row=2;column=1;break;  //顯示"8"
  71.                   case 0xbb:row=2;column=2;break;  //顯示"9"
  72.                  }        
  73.             key=tab[row][column];
  74.             return (key);
  75.          }

  76.         }

  77. void main()
  78.     {
  79.         uchar i;                   //定時器初始化
  80.         Timer0_Init();            
  81.         LCD_int();                 //1602液晶模塊初始化
  82.         LCD_prints("Welcome");
  83.         P0=0xff;

  84.         while(1)
  85.            {
  86.                 temp=keyscan();
  87.                 if(temp!=0)
  88.                   {
  89.                         P0=temp;
  90.                         LCD_set_position(0x40+i);   
  91.                         LCD_printc(temp);
  92.                         i++;
  93.                         if(i==17)
  94.                           {
  95.                           i=0;
  96.                           LCD_write_com(0x01);
  97.                           LCD_prints("Welcome");
  98.                           LCD_set_position(0x40+i);
  99.                           LCD_printc(temp);
  100.                           }
  101.                    }
  102.                
  103.         }
  104.     }


  105. void Timer0_Init()  //定時器初始化
  106.   { //2毫秒@11.0592MHz
  107.      AUXR |= 0x80;                //定時器時鐘1T模式
  108.      TMOD &= 0xF0;                //設置定時器模式
  109.      TL0 = 0x9A;                  //設置定時初值
  110.      TH0 = 0xA9;                  //設置定時初值
  111.      TF0 = 0;                     //清除TF0標志
  112.      TR0 = 1;                     //定時器0開始計時
  113.      ET0 =1;
  114.      EA = 1;
  115.   }

  116. void Timer0() interrupt 1 //定時器中斷
  117.   {                     //16位自動重裝模式,無需重賦初值            
  118.    if(Timer_10ms_con==1)  Timer_10ms++;         

  119.   }
復制代碼


//LCD1602.C

  1. #include<STC15F2K60S2.h>
  2. #include "hardware.h"
  3. #include "lcd1602.h"
  4. #define  uchar unsigned char
  5. #define  uint unsigned int

  6. void LCD_check_busy()   //檢測LCD狀態
  7. {
  8. while(1)
  9.   {
  10.    LCD_EN=0;
  11.    LCD_RS=0;
  12.    LCD_RW=1;
  13.    LCD_DATA=0xff;
  14.    LCD_EN=1;
  15.    if(!LCD_BUSY)  break;
  16.   }
  17. LCD_EN=0;
  18. }

  19. void LCD_cls()          //LCD清屏
  20. {
  21. //LCD_check_busy();    //仿真時該語句可以屏蔽
  22. LCD_RS=0;
  23. LCD_RW=0;
  24. LCD_DATA=1;
  25. LCD_EN=1;
  26. LCD_EN=0;

  27. }

  28. void LCD_write_com(uchar com)            //寫指令到LCD                        
  29. {
  30. LCD_check_busy();                    
  31. LCD_RS=0;
  32. LCD_RW=0;
  33. LCD_DATA=com;
  34. LCD_EN=1;
  35. LCD_EN=0;
  36. }
  37. void LCD_write_data(uchar LCD_data)      //寫一個字節數據到LCD
  38. {
  39. LCD_check_busy();
  40. LCD_RS=1;
  41. LCD_RW=0;
  42. LCD_DATA=LCD_data;
  43. LCD_EN=1;
  44. LCD_EN=0;
  45. }

  46. void LCD_set_position(uchar x)            //LCD光標定位到x處
  47. {
  48. LCD_write_com(0x80+x);
  49. }

  50. /*
  51. void LCD_go_home(void)                    //LCD光標歸位
  52. {
  53. LCD_write_instruction(LCD_GO_HOME);
  54. }
  55. */

  56. void LCD_printc(uchar lcd_data)           //輸出一個字符到LCD
  57. {
  58. LCD_write_data(lcd_data);
  59. }

  60. void LCD_prints(uchar *lcd_string)        //輸出一個字符串到LCD
  61. {
  62. uchar i=0;
  63. while(lcd_string[i]!=0x00)
  64.   {
  65.    LCD_write_data(lcd_string[i]);
  66.    i++;
  67.   }
  68. }

  69. void LCD_int()                            //初始化LCD
  70. {
  71. LCD_write_com(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
  72. LCD_write_com(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
  73. LCD_write_com(LCD_DISPLAY_DOUBLE_LINE);
  74. LCD_cls();
  75. LCD_write_com(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
  76. }
復制代碼



//LCD1602.H

  1. #ifndef __LCD_H__
  2. #define __LCD_H__
  3. #define LCD_GO_HOME               0x02         //AC=0,光標、畫面回HOME位
  4. //輸入方式設置
  5. #define LCD_AC_AUTO_INCREMENT     0x06         //數據讀、寫操作后,AC自動增一
  6. #define LCD_AC_AUTO_DECREASE      0x04         //數據讀、寫操作后,AC自動減一
  7. #define LCD_MOVE_ENABLE           0x05         //數據讀、寫操作,畫面平移
  8. #define LCD_MOVE_DISENABLE        0x04         //數據讀、寫操作,畫面不動
  9. //設置顯示、光標及閃爍開、關
  10. #define LCD_DISPLAY_ON            0x0C         //顯示開
  11. #define LCD_DISPLAY_OFF           0x08         //顯示關
  12. #define LCD_CURSOR_ON             0x0A         //光標顯示
  13. #define LCD_CURSOR_OFF            0x08         //光標不顯示
  14. #define LCD_CURSOR_BLINK_ON       0x09         //光標閃爍
  15. #define LCD_CURSOR_BLINK_OFF      0x08         //光標不閃爍
  16. //光標、畫面移動,不影響DDRAM
  17. #define LCD_LEFT_MOVE             0x18         //LCD顯示左移一位
  18. #define LCD_RIGHT_MOVE            0x1C         //LCD顯示右移一位
  19. #define LCD_CURSOR_LEFT_MOVE      0x10         //光標左移一位
  20. #define LCD_CURSOR_RIGHT_MOVE     0x14         //光標右移一位
  21. //工作方式設置
  22. #define LCD_DISPLAY_DOUBLE_LINE   0x38         //兩行顯示
  23. #define LCD_DISPLAY_SINGLE_LINE   0x30         //單行顯示
  24. void LCD_cls(void);
  25. void LCD_write_data(unsigned char);
  26. void LCD_initial(void);
  27. void LCD_set_position(unsigned char);
  28. void LCD_prints(unsigned char *);
  29. void LCD_printc(unsigned char);
  30. #endif


  31. //hardware.h
  32. #include<STC15F2K60S2.h>
  33. #ifndef __HARDWAR_H__
  34. #define __HARDWAR_H__
  35. /*---------------------------------------------------------
  36.                    LCD數據、控制口定義
  37. ---------------------------------------------------------*/
  38. #define LCD_DATA P1      //LCD的數據口
  39. #define key_data P3      //矩陣鍵盤的數據口
  40. sbit LCD_BUSY=LCD_DATA^7;  //LCD忙信號位

  41. sbit LCD_RW=P2^0;          //LCD讀寫控制
  42. sbit LCD_RS=P2^1;          //LCD寄存器選擇
  43. sbit LCD_EN=P2^2;          //LCD使能信號*/
  44. #endif
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:66287 發表于 2018-12-1 08:27 | 顯示全部樓層
仿真板
1.png
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产成人午夜av影院武则天 | 久久999| 91精品欧美久久久久久久 | 久草免费在线视频 | 欧美极品在线视频 | 色综合色综合网色综合 | 日本国产一区二区 | 日韩靠逼 | 亚洲精品4| 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 日韩在线小视频 | 日韩在线资源 | 精品国产伦一区二区三区观看方式 | 日本一区精品 | 亚洲日产精品 | 日韩毛片视频 | 精品久久久久久亚洲综合网站 | 超碰网址| 人人爽日日躁夜夜躁尤物 | 日日射影院 | 99精品免费久久久久久久久日本 | 日本黄色大片免费看 | 999久久久精品 | 亚洲国产日韩欧美 | 中文字字幕在线中文乱码范文 | 中文字幕日韩欧美 | 久久99深爱久久99精品 | 天天曰天天曰 | 97视频网站 | 色接久久 | 国产精品99久久久久久动医院 | 欧美色性| 国产欧美一区二区三区久久手机版 | a级片在线 | 国产伦精品一区二区三区照片91 | 日韩成人精品在线 | 久久久91| 久久狠狠| 成人精品在线观看 | 久久激情视频 | 午夜天堂精品久久久久 |