12864LCD显示倒计时程序

12864LCD显示倒计时程序
12864LCD显示倒计时程序

简介:第一行显示,距离系统爆炸时间

第二行显示,还剩

第三行显示,00时,00分,00秒

第四行显示,周林

按下旋钮开关,开始设定秒,秒编辑位闪动。左右旋转设定数值,

在按下开关,秒确定,设定分,分编辑位闪动左右调数值,

再按下,分确定,小时位闪动。左右转调小时,再按一下。时间确定,开始倒计时。到达定时时间后停止,并闪动。

#include

#include

/********************* 定义********************************/

#define LCD_data P0 //数据口

sbit LCD_RS = P2 ^ 0; //寄存器选择输入

sbit LCD_RW = P2 ^ 1; //液晶读/写控制

sbit LCD_EN = P2 ^ 2; //液晶使能控制

sbit LCD_PSB = P2 ^ 3; //串/并方式控制

sbit LCD_RST = P2 ^ 5; //液晶复位端口

sbit sset=P3^4;//设置按钮

sbit spk=P1^4;

sbit sadd=P2^7;

sbit sdel=P2^6;

signed char second=0,minute=0,hour=0,count=0,keycount=0;

signed char key=0;

unsigned char code DIS1[] =

{

"距离系统爆炸时间"

};

unsigned char code DIS2[] =

{

"还剩:"

};

unsigned char code DIS31[] =

{

"时"

};

unsigned char code DIS32[] =

{

"分"

};

unsigned char code DIS33[] =

{

"秒"

};

unsigned char code DIS4[] =

{

"周林"

};

unsigned char code table2[]="0123456789";

char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节

/*********************延时子函数**************************/

void delayNOP()//us延时子函数(4.34us)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

void delayms(unsigned int ms)//ms延时子函数

{

unsigned char y;

while (ms--)

{

for (y = 0; y < 114; y++)

;

}

}

//******************检查LCD忙状态**************************

bit lcd_busy()//检查LCD忙状态1忙,0闲

{

bit result;

LCD_RS = 0;

LCD_RW = 1;

LCD_EN = 1;

delayNOP();

result = (bit)(P0 &0x80);

LCD_EN = 0;

return (result);

//***********************写指令数据***********************

void lcd_wcmd(unsigned char cmd)//写指令数据到LCD

{

while (lcd_busy())

{

;

}

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 1;

P0 = cmd;

delayNOP();

LCD_EN = 0;

}

void lcd_wdat(unsigned char dat)//写显示数据到LCD

{

while (lcd_busy())

;

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 1;

P0 = dat;

delayNOP();

LCD_EN = 0;

}

void writesmh(unsigned char add,unsigned char date)//显示个位和十位数据{

unsigned char shi,ge;

shi=date/10;

ge=date%10;

lcd_wcmd(0x80+add);

delayms(5);

lcd_wdat(table2[shi]);

delayms(5);

lcd_wdat(table2[ge]);

delayms(5);

}

//*********************初始化设定****************************

void lcd_init()

{

LCD_PSB = 1; //并口方式

LCD_RST = 0; //液晶复位

delayms(5); //液晶复位

LCD_RST = 1; //液晶复位

delayms(5); //液晶复位

lcd_wcmd(0x34); //扩充功能设定,扩充指令,选8位数据

delayms(5);

lcd_wcmd(0x30); //功能设定,基本指令操作,选8位数据

delayms(5);

lcd_wcmd(0x0C); //显示开,关光标,关光标反白允许。

delayms(5);

lcd_wcmd(0x04); //光标的移动方向

delayms(5);

lcd_wcmd(0x01); //清除LCD的显示内容

delayms(5);

TMOD=0x01;

TH0=0x3C;

TL0=0xB0;

EA=1;

ET0=1;

TR0=0;

EX0=0; //外部中断0允许

IT0=1; //外部中断0为边沿触发方式

}

//*********************设定显示位置子函数**********************

void lcd_pos(unsigned char X, unsigned char Y)//设定显示位置

{

unsigned char pos;

if (X == 1)

{

X = 0x80;

}

else if (X == 2)

{

X = 0x90;

else if (X == 3)

{

X = 0x88;

}

else if (X == 4)

{

X = 0x98;

}

pos = X + Y; //确定显示地址

lcd_wcmd(pos); //写显示地址

}

//*****************清屏子函数***************************

void clr_screen()//清屏子函数

{

lcd_wcmd(0x34); //扩充指令操作

delayms(5);

lcd_wcmd(0x30); //基本指令操作

delayms(5);

lcd_wcmd(0x01); //清屏

delayms(5);

}

//******************闪烁子函数************************** void lcdflag()

{

lcd_wcmd(0x08); //关闭显示

delayms(500);

lcd_wcmd(0x0c); //开启显示

delayms(500);

lcd_wcmd(0x08);

delayms(500);

lcd_wcmd(0x0c);

delayms(500);

lcd_wcmd(0x08);

delayms(500);

lcd_wcmd(0x0c);

delayms(500);

}

//******************写字符串子函数*************************

void wr_string(unsigned char str[])//写字符串子函数

{

unsigned char num = 0;

while (str[num])

{

lcd_wdat(str[num++]); //写数据

}

}

//********************按键设置时间************************* void keyscan()//按键设置时间

{

if(sset==0)

{

delayms(10);

if(sset==0)

{

EX0=1;

keycount++;

while(sset==0)

{

;

}

if(keycount==1)

{

TR0=0; //停止计时

key=1;

keycount=2;

lcd_wcmd(0x8e);

lcd_wcmd(0x0d);//秒位闪烁

}

if(keycount==2)

{

;

}

if(keycount==3)

{

keycount=4;

lcd_wcmd(0x8c);

lcd_wcmd(0x0d);//分位闪烁

//lcd_wcmd(0x04);光标左移一位}

if(keycount==4)

{

;

}

if(keycount==5)

{

keycount=6;

lcd_wcmd(0x8a);

lcd_wcmd(0x0d);//时位闪烁

}

if(keycount==6)

{

;

}

if(keycount==7)

{

keycount=0;

lcd_wcmd(0x0c);//停止闪烁

TR0=1; //开始计时

EX0=1;

}

}

}

if(keycount!=0)

{

if(keycount==2)//编辑秒

{

if(sadd==0)//数值加1

{

delayms(10);

if(sadd==0)

{

second++;

if(second==60)

{

second=0;

}

sadd=1;

}

writesmh(0x0e,second);

lcd_wcmd(0x8e);

lcd_wcmd(0x0d);//秒位闪烁

}

if(sdel==0)//数值减1

{

delayms(10);

if(sdel==0)

{

if(second==0)

{

second=60;

}

second--;

sdel=1;

}

writesmh(0x0e,second);

lcd_wcmd(0x8e);

lcd_wcmd(0x0d);//秒位闪烁}

}

if(keycount==4)//编辑分钟

{

if(sadd==0)//数值加1

{

delayms(10);;

if(sadd==0)

{

minute++;

if(minute==60)

{

minute=0;

}

sadd=1;

}

writesmh(0x0c,minute);

lcd_wcmd(0x8c);

lcd_wcmd(0x0d);//分位闪烁}

if(sdel==0)//数值减1

{

delayms(10);

if(sdel==0)

{

if(minute==0)

{

minute=60;

}

minute--;

sdel=1;

}

writesmh(0x0c,minute);

lcd_wcmd(0x8c);

lcd_wcmd(0x0d);//分位闪烁}

}

if(keycount==6)//编辑小时

{

if(sadd==0)//数值加1

{

delayms(10);

if(sadd==0)

{

hour++;

if(hour==24)

{

minute=0;

}

sadd=1;

}

writesmh(0x0a,hour);

lcd_wcmd(0x8a);

lcd_wcmd(0x0d);//时位闪烁

}

if(sdel==0)//数值减1

{

delayms(10);

if(sdel==0)

{

if(hour==0)

{

hour=24;

}

hour--;

sdel=1;

}

writesmh(0x0a,hour);

lcd_wcmd(0x8a);

lcd_wcmd(0x0d);//时位闪烁

}

}

}

}

//主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数

void main()

{

delayms(100); //上电,等待稳定

lcd_init(); //初始化LCD

lcd_pos(1, 0); //设置显示位置为第一行

wr_string(DIS1);

lcd_pos(2, 0); //设置显示位置为第二行

wr_string(DIS2);

lcd_pos(3, 3); //设置显示位置为第四行

wr_string(DIS31);

lcd_pos(3, 5); //设置显示位置为第四行

wr_string(DIS32);

lcd_pos(3, 7); //设置显示位置为第四行

wr_string(DIS33);

lcd_pos(4, 6); //设置显示位置为第四行

wr_string(DIS4);

writesmh(0x0e,second);

delayms(5);

writesmh(0x0c,minute);

delayms(5);

writesmh(0x0a,hour);

delayms(5);

while (1)

{

keyscan();

}

}

//**********************中断***************************

void time0() interrupt 1 using 0//倒计时中断

{

TH0=0x3C;

TL0=0xB0;

count++;

if(count==20)

{

count=0;

second--;

if(second<0)

{

second=59;

minute--;

if(minute<0)

{

minute=59;

hour--;

if(hour<0)

{

hour=24;

}

lcd_pos(3, 2); //设置显示位置为第三行,第七列

writesmh(0x0a,hour);

}

lcd_pos(3, 4); //设置显示位置为第三行,第七列

writesmh(0x0c,minute);

}

lcd_pos(3, 6); //设置显示位置为第三行,第七列

writesmh(0x0e,second);

if((second==0)&&(minute==0)&&(hour==0))//到点后响铃

{

TR0=0;

spk=0;

second=0;

minute=0;

hour=0;

lcdflag();

spk=1;

}

}

}

void encoder(void) interrupt 0//外部中断0 旋转码开关中断程序{

if(INT1==1)

{

sadd=0;

sdel=1;

}

if(INT1==0)

{

sdel=0;

sadd=1;

}

}

//*********************************************************

由LCD12864初探嵌入式菜单设计(完全资料)

由LCD12864初探嵌入式系统设计 --菜单设计 声明:本文来自互联网,由于年代久远未能找到出处,现整理如下希望大家喜欢,如有侵权请联系 真的好想你QQ: 1320249827 前言往往要解释写文章的动机和原因,同时给作者一个正题以外灌水的机会——本文也不例外。 1、为什么我要写这篇文章。 不可否认,我的确受到了Armok 的利诱影响,但是最近发生的一些事情却使我觉得写这篇文章是非常有必要的。在OurA VR 上看到很多版本的LCD 驱动程序,几乎每一个版本都只是简单的将全部或部分的显示数据Cover 到LCD 的显存上,完成一个字或者是图片的显示就等着大家喊“牛”了。其实要走的路还很远。对一个工程项目来说,增加n 多的成本来提供一个点阵屏作为用户接口,不是一两幅欢迎图片和Now Loading...Please Standy By 的提示能糊弄的过去的。用户希望你提供的是友好的图形界面GUI ,虽然比不过XP 和Apple 的华丽,但是由各种基本图形组成的窗口界面还是需要的。 当我们真的想实现一个图形界面的时候,很快就会发现,我们需要的不仅仅是一个被喊了“牛”的初级驱动,我们需要的是一个图形引擎——一个自定义的图形函数包,没有DirectX 的华丽,但是能绘制一个任意的直线或是矩形就够了——结果往往发现无所适从。这个时候,我们遇到的就是一个门槛,真正的嵌入式工程师和一个业余电子爱好者之间的门槛。 2、我如何写这篇文章 考虑到本人老王卖瓜的习惯,所以请大家一定无比在吃饭前看本人写的技术文章,同时保持耐心等待续集(绝对有续集)。本人现单身,个人问题众多,学习任务重,所以可能有时候写文章象羊拉屎,不对大家 胃口,请见谅。 硬件平台:A VR Mega8级 LCD : 不带字库的12864 软件平台:ICC 规范: 符合基本的C 编程规范 3、何时开始正文 其实,本文应该算是计算机图形学的一个具体分支,所以,计算机图形学的基本要求就是本文的基本要求,考虑到各位兄弟的胃口,我就多罗嗦下。 h t t p :// h i .b a i d u .c o m /b a l l 648500361

驱动程序原理

知识体系结构 应用程序:是一段可以执行的代码,由操作系统管理。 编译原理,链接器,装载器:是对操作系统依赖的一个工具,将用户的代码变成可执行的机器码,编译器仅仅检查和翻译用户的语言逻辑,但并不装配成符合操作系统要求的可执行文件格式,如windows要求的EXE文件为PE格式(EXE文件并不仅仅是一个可执行的代码段,而且包含了很多其他的内容,如数据段)。 操作系统接口API:是一个可以被用户程序调用的系统功能接口,可以说,我们编写程序,除了计算和流程控制这些只需要用到CPU指令和CPU寄存器的代码外,其余要访问其他(硬件)资源(包括内存,外设)的代码,均是通过调用OS的API来操作除CPU外的资源的,如向屏幕写一个字母,对于程序来说简单得很,print(“A”); 但是其编译后执行的过程是复杂的,编译后的程序会调用操作系统的API,将当前应用程序的状态(上下文,如光标的位置)以及字母传递给显示器的驱动程序去显示。 操作系统管理与调度:操作系统要实现一般通用的资源管理,也要实现资源使用的协调,包含CPU,内存,磁盘,外设。 首先要确定为什么需要操作系统,操作系统设计的目标是什么? 1.我们总是不能等做完一件事情才去做另外一件,因为有些事情做的过程需要等待,有时候也需要暂停一下当前的任务,先去处理更急的事情,等我回来 时又需要以前的任务保持当时的状态,所以需要计算机也要具备这样的能 力,那怎么实现呢? 2.CPU和内存是计算机的最需要的资源,就如我们的人脑一样,一般很难在同一时间做两件事情。需要处理好一件事情再处理另一件,如果处理得越快就 越好,但是不能前一件事情要等待,你就休息了,后面一件也做不了,计算 机的办法就是你不用CPU了,那好你等待下,我先处理下一个事情。 3.我们写程序,不可能对每个应用,我们重新去写那些驱动程序,也不可能按照自己的想法去处理这些通常的资源管理。否则很多人各自写的应用软件就 没法在一个电脑上运行。 操作系统目标: 1.实现代码重用,对于硬件的访问,对于CPU和内存的充分利用,使不同的应用不需要重新去写这些代码。 2.实现各个任务(不同应用程序)的协调使用,使用户可以实现暂停、重新启用某个任务。 3.实现数据的安全管理,实现良好的人机界面的管理。 4.实现一个开放的体系结构,提供系统调用使用户可以快速编写自己的应用,并提供编译器、链接器、装载器来让用户编写的程序变成可以与操作系统接口的 可执行软件。 操作系统的功能分层: CPU管理是操作系统的核心:操作系统与用户程序其实可以看成是一个程序,与以前的单任务系统和单片机程序没有本质的区别。 我们来看整个PC机运行过程: 1.系统上电。 2.主板上CPU的CS值设置为0Fx000,IP值设置为0xFFF0,这样CS:IP就指向0xFFFF0位置,这个是程序的开始地址,而硬件上在总线上挂接在0xFFFF0地址 的是主板的BIOS芯片,BIOS开始运行,BIOS是Basic Input Output System简写, 意思即基本的输入输出系统,如果学过单片机就很好理解,其实就是一个程序,由主

设备驱动程序

驱动程序 驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被比作“硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。 中文名 驱动程序 外文名 Device Driver 全称 设备驱动程序 性质 可使计算机和设备通信的特殊程序 目录 1定义 2作用 3界定 ?正式版 ?认证版 ?第三方 ?修改版 ?测试版 4驱动程序的开发 ?微软平台 ?Unix平台 5安装顺序 6inf文件 1定义 驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 惠普显卡驱动安装 正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设

备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。 设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。 所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。 戴尔电脑驱动盘 驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。 在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。 在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows 自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS 模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附

12864并行多级菜单程序

#include "includes.h" u8 key=0,hua; extern u32 Second; extern u32 minite,hour,day,k,month,year,shan; u8 xingqi[]={"一二三四五六日"}; u8 ModeFlag=0,wei=0;//液晶界面选择 int main(void) { u8 PasswordIndex=0;//密码数组索引 u8 Password[4]={" "};//存储密码数组 BSP_Init();//初始化外部资源 ModeFlag=0; while(1) { //////////////////////////////////////// 界面一////////////////////////////////// if(ModeFlag==0) { LCD12864_Waddr(1,3); LCD12864_WPoss(0,"WELCOME!"); LCD12864_Waddr(2,2); LCD12864_WPoss(0,"--欢迎使用--"); Delay_1ms(8000); LCD12864_Clear(); } //////////////////////////////////////// 界面二////////////////////////////////// // ModeFlag=0; ///// 改 while(ModeFlag==0) //进入登录界面 { LCD12864_Waddr(1,1); LCD12864_WPoss(0,"请输入登陆密码:"); LCD12864_Waddr(2,3); //LCD12864_WPoss(0," "); LCD12864_Waddr(3,1); LCD12864_WPoss(0,"密码为四位数字"); LCD12864_Waddr(4,1); LCD12864_WPoss(0,"删除*");

AT89s52LCD12864多页菜单按键选择操作

AT89s52-LCD12864多页菜单按键选择操 作 这篇程序的代码还未理解清楚,再一次深刻发现自 己的算法水平不行。今天学到的东西还行,就是那些C 文件的一些知识。反正都是些优化的东西,以后肯定也 用的着,过几天有兴趣的话,再去学习一下AVR单片机。 程序代码:硬件上与前面一样,有点变化就是多了 两个翻页的按键。到现在一整天的饭都还没吃,该去吃了,干这个果然不会困。 #include #include sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; sbit PSB= P2^1; //串并口选择端并高串低

#define DataPort P0 sbit KEY_ADD=P3^3; //按键 sbit KEY_DEC=P3^4; unsigned char curr,currold;//全局变量,当前箭头位置 unsigned char code user16x16[]={ //箭头图片 0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00 ,0x3E,0x00,0x3F,0x00,0x3F,0x80, 0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00 ,0x38,0x00,0x30,0x00,0x20,0x00, }; unsigned char code *MainMenu[]= { {" 1.设置1"}, {" 2.设置2"}, {" 3.设置3"}, {" 4.设置4"}, {" 5.设置5"}, {" 6.设置6"}, {" 7.设置7"}, {" 8.设置8"}, {" 9.设置9"},

最完整的12864测试程序

以下是RT12864引脚功能定义 引脚号 管脚 说明 1 Vss 电源地(0V)。 2 VDD 电源正(+5V)。 3 V0 LCD 驱动电压,应用时在VEE 与V0之间加一20K 可调电阻。 4 D/I 数据\指令选择: 高电平:数据D0-D7将送入显示RAM 低电平:数据D0-D7将送入指令寄存器执行。 5 R/W 读\写选择:高电平:读数据;低电平:写数据。 6 E 读写使能,高电平有效,下降沿锁定数据。 7 DB0 数据输入输出。 8 DB1 9 DB2 10 DB3 11 DB4 12 DB5 13 DB6 14 DB7 15 CS1 片选择信号,低电平时选择前64列。 16 CS2 片选择信号,低电平时选择后64列。 17 RET 复位信号,低电平有效。 18 VOUT LCD 驱动电源(-10V )。 19 LED+ 背光电源,LED+(+5V)。 20 LED- 背光电源,LED-(0V)。

以下是RT12864引脚功能定义 引脚号 管脚 说明 1 Vss 电源地(0V)。 2 VDD 电源正(+5V)。 3 V0 LCD驱动电压,应用时在VEE与V0之间加一20K可调电阻。4 D/I 数据\指令选择: 高电平:数据D0-D7将送入显示RAM 低电平:数据D0-D7将送入指令寄存器执行。 5 R/W

读\写选择:高电平:读数据;低电平:写数据。6 E 读写使能,高电平有效,下降沿锁定数据。7 DB0 数据输入输出。 8 DB1 9 DB2 10 DB3 11 DB4 12 DB5 13 DB6 14 DB7 15 CS1 片选择信号,低电平时选择前64列。 16 CS2 片选择信号,低电平时选择后64列。 17 RET 复位信号,低电平有效。 18 VOUT LCD驱动电源(-10V )。 19 LED+ 背光电源,LED+(+5V)。 20 LED- 背光电源,LED-(0V)。

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟) 实现功能:简单,数字时钟+日期(以后会不断完美)。 C语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端口设置 */ sbit SCK=P3^6; //DS1302时钟 sbit SDA=P3^4; //DS1302 IO sbit RST = P3^5; // DS1302复位 bit ReadRTC_Flag; //读DS1302全局变量 /* 12864端口定义*/ #define LCD_data P0 //带字库液晶12864数据口 sbit LCD_RS = P2^4; //寄存器选择输入 sbit LCD_RW = P2^5; //液晶读/写控制 sbit LCD_EN = P2^6; //液晶使能控制 sbit PSB=P2^1; //并口控制 sbit RES=P2^3; uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字 uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年 09-10-19 16:07:00 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日

如何知道驱动程序已经安装

百度首页 | 百度空间 | 登录 nnffnnnnffnn 空间主页博客相册|个人档案 |好友查看文章 如何知道驱动程序已经安装2007-02-25 23:02Windows 98和Windows Me系统中∶在桌面上,用鼠标右键点击“我的电脑”图标,在弹出的菜单中点“属性”,即打开了“系统属性”窗口。在“系统属性”窗口中点击“设备管理器”选项卡,这时可在窗口中看到电脑中所有设备类型的列表。展开某一种设备类型前面的“+”号,即可看到电脑中该类设备的所有型号。如果你在这个窗口中看到有某设备类型前面有黄色的“?”号,即说明系统当前对该设备不认识还没有安装驱动程序。需要手工安装驱动程序。如果你在这个窗口中看到有某设备类型前面有黄色的“!”号,即说明当前该设备驱动有问题或存在硬件冲突需要重新安装驱动程序。 Windows 2000/XP/2003系统中∶ 在桌面上,用鼠标右键点击“我的电脑”图标,在弹出的菜单中点“属性”,即打开了“系统属性”窗口。在“系统属性”窗口中点击“硬件”选项卡,然后点击“设备管理器”,打开设备管理器窗口,这时可在窗口中看到电脑中所有设备类型的列表。展开某一种设备类型前面的“+”号,即可看到电脑中该类设备的所有型号。如果你在这个窗口中看到有某设备类型前面有黄色的“?”号,即说明系统当前对该设备不认识还没有安装驱动程序。需要手工安装驱动程序。如果你在这个窗口中看到有某设备类型前面有黄色的“!”号,即说明当前该设备驱动有问题或存在硬件冲突需要重新安装驱动程序。

在设备管理器中显示所有驱动程序已经安装,但并不能说明所有驱动程序安装正确,这一点要特别注意。在Windows系统中经常会出现系统错误识别硬件,而引起硬件工作异常或不能工作的现象。下一篇:Vista硬盘安装详细图解相关文章:?笔记本电脑 - 如何在 Windows XP... ?如何准确安装驱动程序 ? Windows中如何正确认识和安装驱... ?如何为笔记本安装驱动程序 ? Windows中如何正确认识和安装驱... ?如何在 Windows Server 2003 中... ?如何安装驱动程序 更多>> zds009 2007-06-21 22:18 我是在电脑维修店装的XP系统,不知道他给我装了没有主板的驱动器, 设备管理器中并没有主板那一项啊,那我怎么判断是否安装呢?谢谢 nnffnn 2007-06-22 06:58 你看没有黄色的问号,就是安装了。

基于12864的菜单设计

编写者:董新凯2011.7.20 仅供交流 #include /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ #include "init.h" #define UINT8 unsigned char #define UINT16 unsigned int #define D_RS PTCD_PTCD4 #define D_RW PTFD_PTFD4 #define D_E PTCD_PTCD0 #define D_L PTCD_PTCD1 //左右半屏选择 #define D_R PTCD_PTCD2 #define D_REST PTFD_PTFD5 //复位选择 #define LED1 PTCD_PTCD5 #define LED2 PTCD_PTCD6 #define LED3 PTCD_PTCD7 #define LED4 PTFD_PTFD6 #define LED5 PTFD_PTFD3 /******************菜单填充**************/ # define FillType_Fill 0x01 //填充黑色 # define FillType_Clear 0x00 //填充白色 const UINT8 zimo[][32]= { /*-- 文字: 菜0 --*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ { 0x04,0x04,0x44,0xC4,0x4F,0x44,0x44,0xC4,0x24,0x24,0x2F,0xB4,0x24,0x04,0x04,0x00, 0x40,0x44,0x24,0x24,0x15,0x0C,0x04,0xFE,0x04,0x0C,0x15,0x24,0x24,0x44,0x40,0x00, }, /*-- 文字: 单 1 --*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ { 0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,0x48,0x4C,0x4A,0x49,0xF8,0x00,0x00,0x00, 0x10,0x10,0x13,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x00, }, /*-- 文字: 一2--*/

USB驱动程序安装说明

USB编程电缆驱动程序安装说明 概述 USB编程电缆或USB接口产品是通过将电脑的USB接口模拟成传统的串行口(通常为COM3),从而使用现有的编程软件或通信软件,通过编程电缆与PLC 等设备的传统接口进行通信。 功能 ●支持的操作系统Windows2000/Windows XP ●完全兼容USB 2.0规范 ●USB总线供电(非隔离产品)、或USB总线供电与PLC的编程口同时供 电(隔离型产品) ●波特率:300bps~1Mbps自动适应 ●每台PC只支持一个USB接口转换产品(如一台电脑需使用多个USB 接口产品,需为各个USB接口产品设置不同的序列号,请咨询生产厂家 索取序列号设置工具软件) 系统要求 请在使用USB编程电缆之前确认你的电脑是IBM PC兼容型并具备以下最低系统要求: ●Intel兼容586DX4-100MHz中央处理器或更高 ●一个标准的USB接口(4-pin A型插座) ●运行操作系统为Windows2000或Windows XP 驱动程序的安装 驱动程序的安装非常简单,只需按提示进行即可,以Windows XP为例,按以下步骤进行: 1、打开将要连接USB编程电缆或USB接口产品的电脑电源,并确认电脑 的USB口已经启动并正常工作。 2、将USB编程电缆或USB接口产品插入电脑的USB接口,Windows将检 测到设备并运行添加新硬件向导帮助你设置新设备,插入驱动程序光盘 并单击下一步继续。 如果Windows没有提示找到新硬件,那么在设备管理器的硬件列表中, 展开“通用串行总线控制器”,选择带问号的USB设备,单击鼠标右键 并运行更新驱动程序。

12864显示程序,51单片机,C语言

12864显示程序,51单片机,C语言 可显示固定中文,字符,数字; 可实时动态刷新显示数字,字符; #include sbit rs=P1^2; sbit rw=P1^1; sbit cs=P1^0; sbit psb=P1^3; unsigned char code table[]={" X0: Y0: "}; unsigned char code table1[]={"现在X1: Y1: "}; unsigned char code table2[]={"划线模式:"}; unsigned char code table3[]={"开始暂停"}; void delay(unsigned char z) //延时 { unsigned i,j; for(i=0;i

cs=0; P2=com; delay(5); cs=1; delay(5); cs=0; } void write_date(unsigned char dat) //写数据 { rs=1; rw=0; cs=0; P2=dat; delay(5); cs=1; delay(5); cs=0; } void pos(unsigned char x,unsigned char y) //起点函数{ unsigned char pos;

if(x==0) x=0x80; else if(x==1) x=0x90; else if(x==2) x=0x88; else if(x==3) x=0x98; pos=x+y/2; write_com(pos); } void init() { unsigned char i; psb=1; //1并行,0串行 write_com(0x30); //基本指令操作 delay(5); write_com(0x0c); //显示开,关光标 delay(5); write_com(0x01); //清除led的显示内容delay(5); pos(0,0);

一个简单的12864显示程序

#include #define uchar unsigned char #define uint unsigned int sbit rs = P1^0; //指令数据选择sbit rw = P1^1; //指令数据控制sbit e= P1^2; sbit d2=P1^4; void _nopc_(){} uchar table[]={ //显示内容 "爸爸妈妈你们好!" }; void delay_50us(uint temp)//延时函数{ uint i,j; for(i=temp;i>0;i--) for(j=50;j>0;j--) ; } void delay_50ms(uint temp)//延时函数{ uint i,j; for(i=temp;i>0;i--) for(j=50000;j>0;j--); } void write_date(uchar temp) //写数据{ rw=0; rs=1; e=1; _nopc_(); P2=temp; e=0; } void write_com(uchar temp) //写命令{ rw=0; rs=0; delay_50us(1); P2=temp; e=1; delay_50us(1); e=0; }

void init()//LCD初始化 { d2=1; delay_50ms(2); write_com(0x30); delay_50us(5); write_com(0x30); delay_50us(2); write_com(0x0f); delay_50us(5); write_com(0x01); delay_50ms(2); write_com(0x06); delay_50ms(10); } void display()//显示函数{ uchar i=0; write_com(0x80); delay_50us(2); for(i=0;i<16;i++) { write_date(table[i]); delay_50us(1); } } void main() { init(); while(1) { display(); while(1); } }

安装win7驱动程序的3种主要方法

安装win7驱动程序的3种主要方法 1 通过网络自动安装驱动程序 在Windows 7系统中,安装设备驱动程序往往都需要获得管理员权限。当发现新的设备后,首先Windows 7会尝试自动读取硬件设备固件内部的硬件信息,然后 与%SystemRoot%\System32、Driver Store\File Repository文件夹系统自带的驱动程序安装信息文件夹包含的ID进行比对,如果能够找到相关符合的硬件∞,并且带有数字签名的驱动程序,那么会在不需要用户干涉的前提下自动安装正确的驱动程序,如图15-3所示为提示正在安装设备驱动程序。安装后自动对系统进行必要的设置,同时会在系统任务栏上,使用气球图标显示相关的提示信息。 图15-3 自动安装设备驱动程序如果经过对比后,Windows 7没有在自带的驱动程序安装信息文件夹中找到所对应的硬件信息,则会自动弹出“发现新硬件”对话框,接着根据对话框的提示进行安装硬件驱动程序即可具体安装方法如下。蕊当电脑检测到新硬件时,会自动到网上Windows Update站点搜索所需的驱动程序。如果找到对应的驱动程序,会自动下载并安装,如图15-4所示。 鬈囊如果系统在网上没有找到硬件所需的驱动程序,此时会允许用户手工安装驱动程序,如果有驱动 程序光盘,将相关光盘放入光驱,然后按照提示进行操作即可完成安装。如果没有光盘,按照如 图15-5所示的方法进行操作。

2 手动安装驱动程序 如果有些硬件设备的驱动程序为.inf格式,则需要用手动安装驱动的方式来安装。手动安装驱动程序的方法如下。 从“设备管理器”窗口中查找没有安装驱动的设备,一般没有安装驱动程序的设备前面标着一个 黄色的问号或显示一个感叹号。一般常见的未知声卡设备名为: PCI Multimedia Audio Device或“未 知多媒体设备”;未知网卡为:PCI Network Adpater Device;未知USB设备为:“未知USB设备”, 如图15-6所示。

LCD12864菜单程序

一起来学LCD12864菜单程序(包含完整程序)一起来学LCD12864菜单程序(包含完整程序) /*------------------------------------------- 项目名:家电中央控制系统工程 程序名:显示MCU总体程序 编写人:杜洋 初写时间:2005年9月5日晚20时 程序功能:实现液晶、语音部分的人机对话和总线的通信 实现方法:用中断实现总线接收 CPU说明:89S5212MHZ晶振 接口说明:(详见初定义) 信息说明: 修改日志: NO.1- -------------------------------------------*/ ;----------------------------------------初定义 LCDDAT EQU P2 RS EQU P3.5 RW EQU P3.6 E EQU P3.7 REDLED EQU P3.4 BACKLED EQU P3.1 PLAY EQU P1.7 STOPIN EQU P3.0 LIN EQU P3.2 SPDAT EQU P1 XX2 EQU P0.0

LT_RAM EQU 30H LR_RAM EQU 40H SP_RAM EQU 20H DIS1_RAM EQU 50H DIS2_RAM EQU 70H DIS3_RAM EQU 60H DIS4_RAM EQU 80H RR1 EQU 26H RR3 EQU 21H RR4 EQU 22H T0_RAM EQU 23H QR3_RAM EQU 24H QR2_RAM EQU 25H LCDDISPLAY EQU 26H ;菜单显示移位寄存器 MENU_RAM EQU 27H ;菜单位置寄存器 ONOFFLCD EQU 28H ;-------------------------------------程序入口 ORG 0000H JMP LCD_START ORG 0003H

如何写驱动程序

我这里重点的介绍如何写驱动程序,对于一些应用程序我就不做介绍了,因为我对于那些高层的东西写得很少。倘若再讲,有班门弄斧之嫌,呵呵! 作为WIN98和WIN2K推荐的一项新技术来说,USB的驱动程序和以往的直接跟硬件打交道的WIN95的VXD的方式的驱动程序不同,它应该是WDM类型的。 USB的WDM接口框图如下(这个图可以说是USB软件总体框图) 对于HID的设备,就可以采用上图左上边的结构,其它类的话采用右上的结构,其实右边的结构可以又细分成两层,一层是Class Driver,一层是Miniport Driver。而倒数第三行的UHCD和OpenHCI分别是由INTEL和COMPAQ两位老大定的一个和硬件有关的底层驱动程序标准,各位可以根据所需要的选择。 对于USB的驱动程序,大家还得去了解WDM驱动程序的写法,或者早些时候的NT驱动程序,其实WDM驱动程序可以看做是NT驱动程序的一个update,只是增加了一些新的特性。 “写驱动程序是一个很漫长和繁琐的工作,在此之前,你最好要熟悉硬件,熟悉C/C++,还要用过DDK,会用一些调试程序,如SOFTICE和WINDBG之类。如果一切就绪,你就可以开始写驱动程序,工作的进程有时侯会取决于你的运气”。(这是一位留美的朋友对我说的,我写出来和大家共享) 下面是我从一个朋友那里得到的一篇文章的摘要: NT驱动程序的分层结构 驱动程序是指管理某个外围设备的一段程序代码。NT采用更灵活的分层驱动方法,允许杂应用程序和硬件之间存在几个驱动程序层次。分层机制允许NT更加广泛地定义驱动程序,包括文件系统、逻辑卷管理器和各种网络组件,各种物理设备驱动程序等等。 1、设备驱动程序 这些是管理实际数据传输和控制特定类型的物理设备的操作的驱动程序,包括开始和完成I/O操作,处理中断和执行特定的设备要求的任何差错处理。

在12864显示任意图片及参考程序

用12864显示单色图片 首先介绍本12864液晶显示器: 型号:QC12864B 因为单片机读取的是数据,而不是直接的图片。得将图片进行取模,图片应该是单色图片,像素128*64。 下面我为大家介绍个实例。 ①、在电脑附件画图,首先设置属性

开始画图 保存文件,注意格式: ②、然后进行取模。

③、编程: #include<> #define uchar unsigned char #define uint unsigned int //宏定义 #define lcd P2 //数据端口 sbit rs=P1^2; //指令/数据选择信号 sbit rw=P1^1; //读写选择信号 sbit e=P1^0; //使能端 sbit psb=P1^3; //串并选择端,高电平为并行,低电平为串行 uchar code ai[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x00,

五款驱动管理软件横评

龙源期刊网 https://www.360docs.net/doc/c45188182.html, 五款驱动管理软件横评 作者:香草 来源:《电脑爱好者》2009年第13期 驱动对于喜欢电脑的人来说是很熟悉的东西了,硬件发烧友们会为了榨取硬件的“潜能”而不断更新最新的驱动,普通爱好者会为了重装系统而进行驱动的安装和备份,而往往我们要为寻找合适的驱动而花费很大的力气,驱动管理软件让这些操作变得容易起来,批量安装,自动检测更新给我们带来了方便,你想知道这些工具哪个最好用吗?今天我们用严格的测试来告诉你答案。 毋庸置疑的测试平台 本次评测为对比测试,每一项测试都在同一软硬件平台下进行,保证了结果的客观,硬件配置如下: CPU:Intel Core2 Duo T7400 @ 2.16GHz;内存:DDR2 667 2GB;主板:Intel 945GM 显卡:GeForce 7400;硬盘类型:SATA 5400RPM。软件系统平台我们使用安装了所有补丁的Windows XP SP3。 客观公正的评测队伍 本次评测更加注重了参与性和互动性,由《电脑爱好者》全体软件编辑、CFan论坛网友和热心读者共同完成,保证了测试结果的公正。 实用为主的评测理念 秉承“实用至上”的准则,我们打破软件的枯燥功能对比,从我们对驱动管理软件的需求出发,分老系统驱动的备份与还原、新装系统的首次安装、个别硬件的驱动更新三个应用实例在对比各个工具的优劣,并在结果上数据客观对比,同时用才艺展示来对比软件的各种特色功能。 我们的测试对象 驱动精灵2009 B2 https://www.360docs.net/doc/c45188182.html,/ 驱动魔法师 1.4.1.6

12864程序

include #include void lcd_init(void); void clr_lcd(void); void send_com(unsigned char cmd); void send_data(unsigned char dat); void chek_busy(void); void set_xy(unsigned char xpos,unsigned char ypos); void print(unsigned char x,unsigned char y,char* str); void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k); unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//欢迎 #define DATA P2 #define CONTROL P0 #define E 7 //并行的使能信 号 sbit E = P0^7 #define RW 6 //并行的读写信 号 sbit RW = P0^6 #define RS 5 //并行的指令数据选择信号 sbit RS = P0^5 #define PSB 4 //并/串行接口选择 sbit PSB = P0^4 #define RST 3 //复位低电平有效 sbit RST = P0^3 #define SETB(x,y) (x|=(1<

LCD12864 多级菜单

首先定义一个菜单结构 typedef struct menu//定义一个菜单 { u8 range_from,range_to; //当前显示的项开始及结束序号 u8 itemCount;//项目总数 u8 selected;//当前选择项 u8 *menuItems[17];//菜单项目 struct menu **subMenus;//子菜单 struct menu *parent;//上级菜单,如果是顶级则为null void (**func)();//选择相应项按确定键后执行的函数 }Menu; Menu MainMenu = { //定义主菜单 0,3,4,0,//默认显示0-3项,总共4项,当前选择第0项 { "设置1 \x10", "设置2 \x10", "输入指令发送", "查询\x10" } }; Menu searchMenu = {//查询菜单 0,3,6,0, { "记帐记录明细", "未采集记录数", "设备机号", "本机IP地址", "记录空间大小", "软件版本" } }; Menu *currentMenu;//当前的菜单 用于显示菜单项 void display(u8 line) //显示菜单项并设置选中的项反白{ int i; line = 3-(currentMenu->range_to-line); Lcd_Fill(0x00); for(i = 0;i<4;i++) {

Lcd_Disp(i+1,0,currentMenu->menuItems[i+currentMenu->range_from]); } highlight(0,line,8,255);//反白显示指定行 } void func(void) { printf("hello\r\n"); } 初始化菜单: void initMenu() { MainMenu.subMenus = malloc(sizeof(&MainMenu)*4); MainMenu.subMenus[0] = NULL;//第1到3项没有子菜单置null,选择后程序会调用func中相应项中的函数 MainMenu.subMenus[1] = NULL; MainMenu.subMenus[2] = NULL; MainMenu.subMenus[3] = &searchMenu;//第四项查询有子菜单 MainMenu.func = malloc(sizeof(&func)*4); MainMenu.func[0] = NULL; MainMenu.func[1] = NULL; MainMenu.func[2] = &func;//当选择了并按了确定,会执行func函数 MainMenu.func[3] = NULL; MainMenu.parent = NULL;//表示是顶级菜单 searchMenu.subMenus = malloc(sizeof(&searchMenu)*6); searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL; searchMenu.func = malloc(sizeof(&printf)*6); searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL; searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项 currentMenu = &MainMenu; } main

相关文档
最新文档