大赛期间训练程序总结报告(一)(编辑修改稿)内容摘要:
存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入( Ds),和一个串行输出( Q7’ ) ,和一个异步的低电平复位,存储寄存器有一个并行 8位的,具备三态的总线输出,当使能 OE时(为低电平),存储寄存器的数据输出到总线。 了解了下该芯片的工作原理后,在看看其驱动电路。 由于我们在进行训练期间,开发板上没有该芯片模块,故我 自己在仿真软件上搭建了该电路,如图: 由上序搭建的电路很容易就可以看出,这里两次调用了 74HC595,用级联方式进行工作的,其工作的方式如下: 单片机先送 1个 8位数据到第一个 595的内部移位寄存器 然后数据会送到内部的输出寄存器 输出。 当 SCLR( 10引脚)为高电平, OE( 13引脚)为低电平时,数据在 SCK( SHCP 上升沿进入移位寄存器,在 LCK( STCP上升沿输出到并行端口。 接着我们具体来看下代码: /* 实验目的: 8段共阳极数码管的动态驱动 74HC595的串并转换功能 */ /* 程序功能: 8段数码管显示 1, 2, 3, 4, 5, 6, 7, 延时 2秒后,显示 8, 9, A,B, C, D, E, F,如此循环 */ // 包含文件 //include //include include include define uchar unsigned char define uint unsigned int // 宏定义延时 1s define Delay_1us _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 \ _nop_()。 _nop_()。 _nop_()。 _nop_() // 8段数码管位选 74595 并口 I/O定义 // QH QG QF QE QD QC QA QB define SEL_EIG 0x80 define SEL_SEV 0x40 define SEL_SIX 0x20 define SEL_FIV 0x10 define SEL_FOU 0x08 define SEL_THI 0x04 define SEL_SEC 0x02 define SEL_FIR 0x01 // 8段数码管段选 74595 并口 I/O定义 define SEG_A 0xfe define SEG_G 0xfd define SEG_DP 0xfb define SEG_D 0xf7 define SEG_E 0xef define SEG_B 0xdf define SEG_C 0xbf define SEG_F 0x7f // 74HC595串口 I/O口定义 sbit DIN = P1^0。 //单片机数据输出口 sbit E_595 = P1^1。 sbit SCK = P1^2。 // 全局变量定义 uchar FIR_Number。 uchar SEC_Number。 uchar THI_Number。 uchar FOU_Number。 uchar FIV_Number。 uchar SIX_Number。 uchar SEV_Number。 uchar EIG_Number。 // 8段数码管(共阳极) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9的字模 code uchar Segments[ ] = { /* SEG_Aamp。 SEG_Bamp。 SEG_Camp。 SEG_Damp。 SEG_Eamp。 SEG_F, // 0 SEG_Bamp。 SEG_C, // 1 SEG_Aamp。 SEG_Bamp。 SEG_Damp。 SEG_Eamp。 SEG_G, // 2 SEG_Aamp。 SEG_Bamp。 SEG_Camp。 SEG_Damp。 SEG_G, // 3 SEG_Bamp。 SEG_Camp。 SEG_Famp。 SEG_G, // 4 SEG_Aamp。 SEG_Camp。 SEG_Damp。 SEG_Famp。 SEG_G, // 5 SEG_Aamp。 SEG_Camp。 SEG_Damp。 SEG_Eamp。 SEG_Famp。 SEG_G, // 6 SEG_Aamp。 SEG_Bamp。 SEG_C, // 7 SEG_Aamp。 SEG_Bamp。 SEG_Camp。 SEG_Damp。 SEG_Eamp。 SEG_Famp。 SEG_G,// 8 SEG_Aamp。 SEG_Bamp。 SEG_Camp。 SEG_Damp。 SEG_Famp。 SEG_G, // 9 SEG_Aamp。 SEG_Bamp。 SEG_Camp。 SEG_Eamp。 SEG_Famp。 SEG_G, // A SEG_Camp。 SEG_Damp。 SEG_Eamp。 SEG_Famp。 SEG_G, // B SEG_Aamp。 SEG_Damp。 SEG_Eamp。 SEG_F, // C SEG_Bamp。 SEG_Camp。 SEG_Damp。 SEG_Eamp。 SEG_G, // D SEG_Aamp。 SEG_Damp。 SEG_Eamp。 SEG_Famp。 SEG_G, // E SEG_Aamp。 SEG_Eamp。 SEG_Famp。 SEG_G, // F */ 0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }。 // 串行数据输出到 595并口 void Output_595(uchar DIS_NUM1, uchar DIS_NUM2) { uchar i。 // 输出 8位段码 这里给数码管输数据相当于串行 通信; for(i=0。 i8。 i++) { DIN = (bit)(DIS_NUM1 amp。 0x80)。 //将最高位,也就是送入 DIS_NUM1 = 0x01。 //将送入的数据的每一位都移到最高位 SCK = 0。 Delay_1us。 Delay_1us。 SCK = 1。 } // 输出 8位位选 for(i=0。 i8。 i++) { DIN = (bit)(DIS_NUM2 amp。 0x80)。 DIS_NUM2 = 0x01。 SCK = 0。 Delay_1us。 Delay_1us。 SCK = 1。 } Delay_1us。 Delay_1us。 E_595 = 0。 // 拉低锁存器控制端 Delay_1us。 Delay_1us。 E_595 = 1。 // 上升沿,将数据输出到锁存器 Delay_1us。 Delay_1us。 E_595 = 0。 // 拉低锁存器控制端 Delay_1us。 Delay_1us。 } // 延时 1ms void Delay_1ms()// @ { unsigned char i, j。 _nop_()。 _nop_()。 i = 12。 j = 168。 do { while (j)。 } while (i)。 } // 主函数 void main(void) { uchar SEG_SEL = 0。 uchar SEG_NUM = 0。 uint i。 //LED_PWM = 0。 while(1) { for(i=0。 i139。 i++) { SEG_SEL = SEL_FIR。 SEG_NUM = Segments[0]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 1个数码管显示 0 Delay_1ms()。 SEG_SEL = SEL_SEC。 SEG_NUM = Segments[1]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 2个数码管显示 1 Delay_1ms()。 SEG_SEL = SEL_THI。 SEG_NUM = Segments[2]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 3个数码管显示 2 Delay_1ms()。 SEG_SEL = SEL_FOU。 SEG_NUM = Segments[3]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 4个数码管显示 3 Delay_1ms()。 SEG_SEL = SEL_FIV。 SEG_NUM = Segments[4]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 5个数码管显示 4 Delay_1ms()。 SEG_SEL = SEL_SIX。 SEG_NUM = Segments[5]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 6个数码管显示 5 Delay_1ms()。 SEG_SEL = SEL_SEV。 SEG_NUM = Segments[6]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 7个数码管显示 6 Delay_1ms()。 SEG_SEL = SEL_EIG。 SEG_NUM = Segments[7]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 8个数码管显示 7 Delay_1ms()。 } for(i=0。 i139。 i++) { SEG_SEL = SEL_FIR。 SEG_NUM = Segments[8]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 1个数码管显示 8 Delay_1ms()。 SEG_SEL = SEL_SEC。 SEG_NUM = Segments[9]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 2个数码管显示 9 Delay_1ms()。 SEG_SEL = SEL_THI。 SEG_NUM = Segments[0x0A]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 3个数码管显示 A Delay_1ms()。 SEG_SEL = SEL_FOU。 SEG_NUM = Segments[0x0B]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 4个数码管显示 B Delay_1ms()。 SEG_SEL = SEL_FIV。 SEG_NUM = Segments[0x0C]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 5个数码管显示 C Delay_1ms()。 SEG_SEL = SEL_SIX。 SEG_NUM = Segments[0x0D]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 6个数码管显示 D Delay_1ms()。 SEG_SEL = SEL_SEV。 SEG_NUM = Segments[0x0E]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 7个数码管显示 E Delay_1ms()。 SEG_SEL = SEL_EIG。 SEG_NUM = Segments[0x0F]。 Output_595(SEG_NUM, SEG_SEL)。 // 第 8个数码管显示 F Delay_1ms()。 } } } 点评: 本小项目的难以理解的地方就是单片机如何将要显示的数据及要位选的那段数码管送入到数码管,理解了这一点,本程序基本就没什么问题。 这里单片机的段选数据及他的位选数据都是通过 口送出的(串行方式),再借用 74HC595 移位存储寄存器来达到程序所表现出来的效果。 2. 3 LCD 显示类 谈到 LCD 就必须涉及到液晶,液晶是一种高分子材料 ,因为其特殊的物理、化学、光学特性,在发现之后就广泛的应用与轻薄型显示上。 LCD 就是我们通常所说的液晶显示器,其工作原理是:以电流。大赛期间训练程序总结报告(一)(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。