1、程序1 目录目录 1图1.10 2LM324 5LM386集成功率放大器 6CM12864-12 751单片机带字库12864液晶动态汉字显示 11单片机课程设计报告电子琴 13音频放大器: 194*4矩形式键盘原理图 22 图1.10 ORG 0000H LJMP MAIN ORG 0040HMAIN:MOV A,#FEHLOOP:MOV P2,A LCALL D01S RL A AJMP LOOP D01S:MOV R6,#100D10mS:MOV R5,#40DL:MOV R4,#123 NOP DJNZ R4,$ DJNZ R5,DL DJNZ R6,D10mSRET END硬件双机通
2、信: ORG 0000H LJMP MAIN ORG 0023H LJMP SINT ORG 0040HMAIN:MOV SP,#5FH MOV TMOD,#20H MOV TH1,#FDH MOV TL1,#FDH MOV PCON,#00H SETB TR1 MOV SCON,#50H SETB EA SETB ES SJMP $SINT:CLR RI MOV A,SBUF MOV P2,A INC A MOV SBUF,A JNB TI,$ CLR TI RETI END 独立式按键与LED显示 图4.10TEMP EQU 30H ORG 0000H JMP START ORG 0100
3、HSTART:MOV SP.#5FH MOV P0,#8CH MOV P3,#0FFHMOKEY:MOV A,P3 CPL A JZ NOKEY MOV TEMP,NOKEY MOV R7,#16 MOV R2,#0 LOOP:MOV A,R2 MOV DPTR,#CODE-P0 MOVC A,A+DPTR MOV P0,A INC R2 SETB RS0 CALL D-1S CLR RS0 DJNZ R7,LOOP JMP START D-1S:MOV R6,#100 D10:CALL D10ms RET D10ms:MOV R5,#10 D1ms:MOV R4,#249 DL:NOP NO
4、P DJNZ R4,DL DJNZ R5,D1ms RETCODE-P0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH ENDLM324的4脚接+12V,11脚接-12V LM386集成功率放大器电压增益2645dB,电源电压+5V.集成稳压器CW317输入电压440V,输出调整电压1.237V,输出电流0.11.5A,从左到右依次是ADJ,Uo,UiCM12864-12模块基本参数:产品型号:CM12864-12显示内容:8个中文字*4行,128 * 64点阵 外形尺寸(mm):93
5、* 70 * 13.5视域尺寸(mm): 73.5 * 39 点 尺 寸(mm):0.48 * 0.48控 制 器:ST7920(1)电压:3.3V,5.0V;模块内自带-10V负压,用于LCD的驱动电压。(2)STN正视反射模式(3)显式模式:黄绿膜、灰膜、蓝膜、黑白膜、(4)显式角度:6点钟直视(5)与CPU接口采用8位数据总线并行输入输出和8条控制线(6)工作温度(Ta):-10+60,存储温度:-20+70(7)背光特征:LED背光(黄绿色、白色、蓝色、红色)(8)模块封装方式:COB(9)功耗:模块自带负压12864汉字液晶屏图形模式研究 本系统采用的显示液晶为12864,横向上有1
6、28个点,纵向上有64个点。我所购买的这块液晶的控制芯片为st7920,内置字库为曰汉字屏。汉字屏并非点阵屏,其画图能力不强大。由于本次要做的系统需要显示点阵,经过几天的研究,我成功实现定点函数Point(x,y)的编写。1.切入点 这块液晶是可以显示图片的,需要准备一张128x64的bmp图片,利用转换软件将其转换为数组,数组的存放格式为0xXX(X代表一个16进制数)。分析其画图函数可以得出,每次写入的数据恰为0xXX,即每次写入8个点。2.XY坐标研究 先分清两个概念,内部地址和物理观察地址不一样!设内部地址变量为LCD_X和LCD_Y,设直观物理观察,左上角物理坐标地址为(x,y)为(
7、0,0)。2864屏并非真正的128x64,而是由256x32人为走线成4行,并且横向X一次移动16个物理点(分两次写入),即内部横向 LCD_X坐标范围0-15,内部纵向LCD_Y坐标范围0-31。其实际初始内部坐标并非为0,而是(LCD_X,LCD_Y)=(80,80)。举例来说,LCD_X=80+8,LCD_Y=80所代表的点的位置为物理位置为从(0,32)开始的纵向16个点。3.缺点和改进 汉字液晶毕竟不是点阵液晶,通过读取数据的方式再写入数据,势必将增大液晶显示的响应时间,特别对本次示波器的高速系统影响较大。如果单片机内存空间足够,可以在其SRAM中开1KB的存储空间用来映射液晶的R
8、AM,可惜本次系统对单片机内部空间要求比较高,若外扩SRAM,必可以提高液晶的响应速度。4.LCD12864液晶图文菜单制作如果采用整屏刷新显然速度太慢,而且存储的数据量太大所以可以采用局部更新的办法,只改变屏上需要变动的某一部分以下就是用这种办法做出的菜单。/* 文件名: LCD12864.c* 功能: LCD12864液晶屏驱动程序代码 */uchar AC_TABLE=0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x88,0x89,0x8a,0x8b,0x8c,0x8d
9、,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, ;void delayus(uint us) while(us-);void Write_byte(uchar byte) uchar i; CLK=0; delayus(2); for(i=0;i8;i+) if(byte&0x80) SID=1; else SID=0; CLK=1; delayus(7); byte=1; CLK=0; delayus(7); void Write_command_12864(uchar com) CS=1; Write_byte(0xf8); Wri
10、te_byte(com&0xf0); Write_byte(com&0x0f)4); CS=0;void Write_data_12864(uchar data) CS=1; Write_byte(0xfa); Write_byte(data&0xf0); Write_byte(data&0x0f)4); CS=0;void PutStr(uchar row,uchar col,uchar *puts) Write_command_12864(0x30); Write_command_12864(AC_TABLE8*row+col); while(*puts!=0) if(col=8) col
11、=0; row+; if(row=4) row=0; Write_command_12864(AC_TABLE8*row+col); Write_data_12864(*puts); puts+; Write_data_12864(*puts); puts+; col+; void LcmClearTXT() uchar i; Write_command_12864(0x30); Write_command_12864(0x80); for(i=0;i64;i+) Write_data_12864(0x20);void LcmClearBMP() unsigned char i,j; Writ
12、e_command_12864(0x34); /8Bit扩充指令集,即使是36H也要写两次 Write_command_12864(0x36); /绘图ON,基本指令集里面36H不能开绘图 for(i=0;i32;i+) /12864实际为256x32 Write_command_12864(0x80|i); /行位置 Write_command_12864(0x80); /列位置 for(j=0;j32;j+) /256/8=32 byte Write_data_12864(0); void PutBMP(const uchar *puts) uint x=0; uchar i,j; Wri
13、te_command_12864(0x34); /8Bit扩充指令集,即使是36H也要写两次 Write_command_12864(0x36); /绘图ON,基本指令集里面36H不能开绘图 for(i=0;i32;i+) /12864实际为256x32 Write_command_12864(0x80|i); /行位置 Write_command_12864(0x80); /列位置 for(j=0;j32;j+) /256/8=32 byte /列位置每行自动增加 Write_data_12864(putsx); x+; void Write_dot(uchar add,const ucha
14、r *puts) uint x=0; uchar i,j,lie; Write_command_12864(0x34); /8Bit扩充指令集,即使是36H也要写两次 Write_command_12864(0x36); if(add0x8f) lie=16; for(i=0+lie;i16+lie;i+) Write_command_12864(0x80|i); Write_command_12864(add); for(j=0;j2;j+) Write_data_12864(putsx); x+; void LCD_12864_Init() Write_command_12864(0x30
15、); Write_command_12864(0x03); Write_command_12864(0x0c); Write_command_12864(0x01); Write_command_12864(0x06);51单片机带字库12864液晶动态汉字显示C语言源程序实验芯片为:AT89S52,带字库液晶屏:12864,实现的目的:动态一个汉字一个汉字显示。其实和显示汉字的程序一样,只是稍做一下修改即可。C语言源程序如下:#include #include #include #include sbit RS=P24;sbit WRD=P25;sbit E=P26;sbit PSB=P21
16、;sbit RES=P23;void TransferData(char data1,bit DI);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg003(unsigned char code *addr1);unsigned char code IC_DAT=我是一个中国人啊;void initinal(void)delay(40);PSB=1; /并口工作模式delay(1);RES=0; /复位delay(1);RES=1; /复位置高delay(10);TransferData(0x30,0);
17、delay(100);TransferData(0x30,0);delay(37);TransferData(0x08,0);delay(100);TransferData(0x10,0);delay(100);TransferData(0x0C,0);delay(100);TransferData(0x01,0);delay(10);TransferData(0x06,0);delay(100);void main(void)while(1) initinal();/调用LCD字库初始化程序 delay(100); lcd_mesg003(IC_DAT);void lcd_mesg003(u
18、nsigned char code *addr1)unsigned char i;/第一行TransferData(0x80,0); delay(100); for(i=0;i16;i+) TransferData(*addr1,1); addr1+; delayms(50); void TransferData(char data1,bit DI) /传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;void delayms(unsigned int n)unsigned int i,
19、j;for(i=0;in;i+) for(j=0;j2000;j+);void delay(unsigned int m)unsigned int i,j;for(i=0;im;i+)for(j=0;j=1&key8; key=0; TH1=high; TL1=low; TR1=1; /开始计数 pulse_cnt=500; while(pulse_cnt!=0); out=0; TR1=0; /* T1定时程序*/void t1() interrupt 3 /T1中断,方式1 TR1=0; TH1=high; TL1=low; TR1=1; out=pulse; pulse=pulse; pulse_cnt-;/* 延时程序*/void delay10ms(un
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1