这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 1.8TFT+ PS2键盘+1602+18B20+数码管+秒表+按键

共24条 1/3 1 2 3 跳转至

1.8TFT+ PS2键盘+1602+18B20+数码管+秒表+按键

工程师
2011-12-19 11:55:40     打赏
都贴上来了,MCU DIY学习过程暂告一段落。。。。期末考试开始了,元旦前结束!!!


1. 按键计数,数码管显示  
2. 数码管动态扫描显示
3.1602动态显示

4.PS2键盘字符全显示
5. 玩转1.8TFT
增补:6 . DS18B20测温
           7.  秒表






1. 按键计数





关键词: 1.8TFT+     键盘     +1602+18B20+         

工程师
2011-12-19 11:59:25     打赏
2楼

工程师
2011-12-19 12:17:30     打赏
3楼
       2. 数码管动态扫描态显示


工程师
2011-12-19 12:20:29     打赏
4楼
数码管扫描程序如下:

#include<reg52.h>

unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值01234567
unsigned char code  seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
/*------------------------------------------------
                    延时子程序
------------------------------------------------*/
void delay(unsigned int cnt)
{
 while(--cnt);
}
/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
 unsigned char i;

 while(1)
      {
 
       P0=dofly[i];//取显示数据,段码
       P2=seg[i];  //取位码
       delay(20000); //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理
       i++;
       if(8==i)    //检测8位扫描完全?
         i=0;
      }
}

工程师
2011-12-19 12:21:48     打赏
5楼
  3  1602动态显示

工程师
2011-12-19 12:24:18     打赏
6楼
程序如下:


#include<reg52.h>

sbit RS = P2^4;   //定义端口
sbit RW = P2^5;
sbit EN = P2^6;

#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_us(unsigned int n) //延时 如果需要高精度延时 请嵌入汇编
{
 if (n == 0)
  { 
  return ; 
  }
  while (--n);
 }
/******************************************************************/
/*                    毫秒函数声明                                */
/******************************************************************/
 void delay_ms(unsigned char i)
 {
 unsigned char a, b;
 for (a = 1; a < i; a++)
 {
   for (b = 1; b; b++)
   {   ;   }
    }
 }
/******************************************************************/
/*                   写入命令函数                                 */
/******************************************************************/
 void LCD_write_com(unsigned char com)
 { 
 RS_CLR;
 RW_CLR;
 EN_SET;
 P0 = com;
 delay_us(5);
 EN_CLR;
 }
/******************************************************************/
/*                   写入数据函数                                 */
/******************************************************************/
 void LCD_write_Data(unsigned char Data)
 {
 RS_SET;
 RW_CLR;
 EN_SET;
 P0 = Data;
 delay_us(5);
 EN_CLR;
 }
/******************************************************************/
/*                   清屏函数                                     */
/******************************************************************/
 void LCD_clear(void)
 {
 LCD_write_com(0x01);
 delay_ms(5);}
/******************************************************************/
/*                   写入字符串函数                               */
/******************************************************************/
 void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
 {    
 if (y == 0)
 {    
 LCD_write_com(0x80 + x);    
 }
 else
 {    
 LCD_write_com(0xC0 + x);    
 }       
 while (*s)
 {    
 LCD_write_Data( *s);    
 s ++;    
 }
 }
/******************************************************************/
/*                   写入字节函数                                 */
/******************************************************************/
 void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data)
 {    
 if (y == 0)
 {    
 LCD_write_com(0x80 + x);    
 }   
 else
 {    
 LCD_write_com(0xC0 + x);    
 }       
 LCD_write_Data( Data); 
 }
/******************************************************************/
/*                   初始化函数                                   */
/******************************************************************/
 void LCD_init(void)
 {
   LCD_write_com(0x38);    /*显示模式设置*/
   delay_ms(5);
   LCD_write_com(0x38);
   delay_ms(5);
   LCD_write_com(0x38);
   delay_ms(5);
   LCD_write_com(0x38); 
   LCD_write_com(0x08);    /*显示关闭*/
   LCD_write_com(0x01);    /*显示清屏*/
   LCD_write_com(0x06);    /*显示光标移动设置*/
   delay_ms(5);
   LCD_write_com(0x0C);    /*显示开及光标设置*/
   }
  
/******************************************************************/
/*                   主函数                                       */
/******************************************************************/  
void main(void)
{
unsigned char i;
unsigned char *p;
delay_ms(100);
LCD_init();
while (1)

i = 1; 
p = "www.eepw.com.cn"; 
LCD_clear(); 
LCD_write_str(2,0,"fwjie MCU DIY); 
delay_ms(250);  
while (*p)
{  
LCD_write_char(i,1,*p);  
i ++;  
p ++;  
delay_ms(250);  

delay_ms(250); 
}
}

工程师
2011-12-19 12:27:52     打赏
7楼
4. PS键盘,字符全显示


工程师
2011-12-19 12:29:05     打赏
8楼
/*-----------------------------------------------
说明:此程序使用标准PS2键盘输入,LCD1602液晶屏输出显示。此样例仅作测试使用
晶振使用12M或者11.0592M,本键盘使用部分字母和数字测试,其他按键不能使用,用
户可以自行扩展。由于开发板和程序的各种参数,程序中没有使用奇偶校验,不保证没有
误码,校验程序请自行添加。
-------------------------------------------------*/

#include<reg52.h>        //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "scancodes.h"   //PS键盘字符码头文件
#include "LCD1602.h"

sbit Key_Data = P3^0 ;   //定义Keyboard引脚
sbit Key_CLK =P3^2;      //使用中断

bit BF;         
bit Shift;               //定义上档键标志
bit Key_UP;              //定义通码断码标志
unsigned char KeyV;
unsigned char IntNum;
unsigned char DisNum;
/******************************************************************/
/*                    函数声明                                    */
/******************************************************************/
void Decode(unsigned char ScanCode);  //解码子程序
/******************************************************************/
/*                    主函数                                      */
/******************************************************************/
void main()
{

IT1 = 0;                              //设外部中断1为低电平触发
EA = 1;                               //外部中断开
EX0 = 1;                              //开中断

InitLcd();                            //初始化1602液晶屏

do
 {
 if (BF)
   Decode(KeyV);
 else
   EA = 1; //开中断
 }
while(1);
}
/******************************************************************/
/*                    外部中断读入信息                            */
/******************************************************************/
void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9))
   {
    KeyV = KeyV >> 1;                //因键盘数据是低>>高,结合上一句所以右移一位
    if (Key_Data)
        KeyV = KeyV | 0x80;          //当键盘数据线为1时到最高位
    }
    IntNum++;
    while (!Key_CLK);                //等待PS/2CLK拉高

    if (IntNum > 10)
       {
         IntNum = 0;                  //当中断11次后表示一帧数据收完,清变量准备下一次接收
         BF = 1;                      //标识有字符输入完了
        EA = 0;                      //关中断等显示完后再开中断
        }
}

/******************************************************************/
/*                    解码信息                                    */
/******************************************************************/
void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
unsigned char TempCyc;

if (!Key_UP)                        //当键盘按下时
    {
    switch (ScanCode)
            {
            case 0xF0 :             // 当收到0xF0,Key_UP置1表示断码开始
                Key_UP = 1;
                break;

            case 0x12 :             // 左 SHIFT
                Shift = 1;
                break;

            case 0x59 :             // 右 SHIFT
                Shift = 1;
                break;

            default:
                if(!Shift)          //如果SHIFT没按下
                    {
                    for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
                    if (UnShifted[TempCyc][0] == ScanCode)
                        {
                           ShowChar(DisNum,UnShifted[TempCyc][1]);
                           DisNum++;
                           if(DisNum==32)
                           {
                            WriteCommand(0x01);//清屏
                            DisNum=0;//重头写数据
                           }
                          }
                     }
                else //按下SHIFT
                    {
                    for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
                    if (Shifted[TempCyc][0] == ScanCode)
                       {
                          ShowChar(DisNum,Shifted[TempCyc][1]);
                           DisNum++;
                        if(DisNum==32)
                          {
                             WriteCommand(0x01);//清屏
                           DisNum=0;//重头写数据
                           }
                          }
                      }

                    break;
             }
    }
else
    {
    Key_UP = 0;
    switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
            {
            case 0x12 : // 左 SHIFT
                Shift = 0;
                break;

            case 0x59 : // 右 SHIFT
                Shift = 0;
                break;
            }
    }
BF = 0; //标识字符处理完了
}



工程师
2011-12-19 12:33:54     打赏
9楼
  PS键盘字符全显示高清图

        完整工程代码ps2键盘LCD1602液晶显示.zip






工程师
2011-12-19 12:43:44     打赏
10楼
5.  玩转1.8TFT
(注:我还有个2.4TFT可是接口和咱板子上不对照,就做了个小板子玩,请参考我的贴子:功能全了,万年历+温度显示仪+弹球游戏)


共24条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]