完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
程序呢!贴出来,让大家看看!
|
|
|
|
#include
#include "ku.h" typedef unsigned char uchar; typedef unsigned int uint; uchar const quwei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char tt; unsigned char a=0,cnt; unsigned char date1; unsigned char i,j,k=8,h=1,chi; unsigned char t0,switch_time,mode_cnt; unsigned int temper,time=1; uchar read_temp_flag; uchar dis_date_flag; uchar cnt_ta=0; #define DS_H P4OUT |= BIT0;//74HC595数据 #define DS_L P4OUT &= ~BIT0; #define CLK_H P4OUT |= BIT1;//74HC595时钟 #define CLK_L P4OUT &= ~BIT1; #define DATA_OUT_H P4OUT |= BIT2;//74HC595数据输出锁存 #define DATA_OUT_L P4OUT &= ~BIT2; #define OE_H P4OUT |= BIT3; #define OE_L P4OUT &= ~BIT3; #define A_138_H P5OUT |= BIT0;// #define A_138_L P5OUT &= ~BIT0; #define B_138_H P5OUT |= BIT1;// #define B_138_L P5OUT &= ~BIT1; #define C_138_H P5OUT |= BIT2;// #define C_138_L P5OUT &= ~BIT2; #define EN_138_H P5OUT |= BIT3;// #define EN_138_L P5OUT &= ~BIT3; uchar cnt; void delay(uint ms) { uint j,k; for(j=0;j } void read_byte_L(uchar date) { uchar i; for(i=0;i<8;i++) { date<<=1; CLK_L; if(date&0x80) { DS_H; } else { DS_L; } CLK_H; } } void HangXuan(unsigned char x) { if(x<8) { EN_138_H; } else { EN_138_L } switch(cnt) { case 7:A_138_L;B_138_L;C_138_L;break; //依次选中点阵的每一行 case 6:A_138_H;B_138_L;C_138_L;break; case 5:A_138_L;B_138_H;C_138_L;break; case 4:A_138_H;B_138_H;C_138_L;break; case 3:A_138_L;B_138_L;C_138_H;break; case 2:A_138_H;B_138_L;C_138_H;break; case 1:A_138_L;B_138_H;C_138_H;break; case 0:A_138_H;B_138_H;C_138_H;break; default: break; } cnt++; if(cnt>7)cnt=0; } /****************************************************** 函数功能:显示汉字,不流动 *******************************************************/ void display_hanzi(unsigned char *p)//*p:指针p是用来指向你想要显示的数组首地址 { unsigned char j; for(j=0;j<16;j++) { read_byte_L(p[2*j+1+96]); read_byte_L(p[2*j+96]); read_byte_L(p[2*j+1+64]); read_byte_L(p[2*j+64]); read_byte_L(p[2*j+1+32]); read_byte_L(p[2*j+32]); read_byte_L(p[2*j+1]); read_byte_L(p[2*j]); DATA_OUT_L; DATA_OUT_H; OE_L; HangXuan(j); // delay_ms(5); OE_H; } } /****************************************************** 函数功能:流动显示固定中文、英文、阿拉伯数字等 *******************************************************/ void Dis_LiuDongHanzi() { OE_L; for(j=0;j<16;j++) { for(i=k;i<8;i++) { if(ku[h+7][j]&quwei[i]) { DS_H; } else { DS_L; } CLK_H; CLK_L; } for(i=0;i<7;i++) { date1=ku[6-i+h][j]; if(date1&0x01) { DS_H; } else { DS_L; } CLK_H; CLK_L; if(date1&0x02) { DS_H; } else { DS_L; } CLK_H; CLK_L; if(date1&0x04) { DS_H; } else { DS_L; } CLK_H; CLK_L; if(date1&0x08) { DS_H; } else { DS_L; } CLK_H; CLK_L; if(date1&0x10) { DS_H; } else { DS_L; } CLK_H; CLK_L; if(date1&0x20) { DS_H; } else { DS_L; } CLK_H; CLK_L; if(date1&0x40) { DS_H; } else { DS_L; } CLK_H; CLK_L; if(date1&0x80) { DS_H; } else { DS_L; } CLK_H; CLK_L; } for(i=0;i if(ku[h-1][j]&quwei[i]) { DS_H; } else { DS_L; } CLK_H; CLK_L; } P5OUT=15-j; DATA_OUT_H; DATA_OUT_L; } chi++; if(chi==1) //改变它的值,可改变流动速度 { chi=0; if(k==0) { k=7; if(h>20) //改变此值,可改变显示图像的长短 { h=1; dis_date_flag=1; } else h++; } else k--; } } /********************主函数********************/ void main(void) { /*下面六行程序关闭所有的IO口*/ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0XFF; P3DIR = 0XFF;P3OUT = 0XFF; P4DIR = 0XFF;P4OUT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; WDTCTL = WDTPW + WDTHOLD; P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换 P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出 P1OUT = 0; P3DIR |= BIT4; // P3.4 output while(1) { Dis_LiuDongHanzi(); } } #pragma vector=WDT_VECTOR __interrupt void watchdog_timer(void) { } #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { } |
|
|
|
可不可以帮忙注释下
|
|
|
|
|
|
|
|
void display_hanzi(unsigned char *p)//*p:指针p是用来指向你想要显示的数组首地址
{ unsigned char j; for(j=0;j<16;j++) // 16点阵吧!所以16次 { read_byte_L(p[2*j+1+96]); read_byte_L(p[2*j+96]); read_byte_L(p[2*j+1+64]); read_byte_L(p[2*j+64]); read_byte_L(p[2*j+1+32]); read_byte_L(p[2*j+32]); read_byte_L(p[2*j+1]); read_byte_L(p[2*j]); DATA_OUT_L; DATA_OUT_H; OE_L; HangXuan(j); // delay_ms(5); OE_H; } } // 96/32= 3,也就是有3个点阵屏幕。因为是级联吗,所以先发最远的然后是最近的。而每屏幕:具体看要你咋设计了,这里我不细看, //可以左右或者右左屏幕组合,再就是上下或者下上组合,总之一个595对应8位,要想控制16的就必须两次完成。 //没了! |
|
|
|
武力戡乱 发表于 2015-5-31 00:52 嗯嗯,谢谢啊,是430单片机的,讲的好清楚,那个是16*64的点阵,是4个16*16组合的,3是因为级联3个吗,能不能顺带讲讲剩下的 |
|
|
|
额,应该是4,我看错了。共有4组。 其他的吗,没啥了,都是一样的套用的。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
4244 浏览 3 评论
5530 浏览 1 评论
5807 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
7533 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1212 浏览 0 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-18 19:22 , Processed in 0.637596 second(s), Total 87, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号