久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2908|回復: 8
打印 上一主題 下一主題
收起左側

想寫一個滾動數碼管滾動11位電話號碼的程序,但想了半天沒想出來

[復制鏈接]
回帖獎勵 20 黑幣 回復本帖可獲得 20 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
單片機原理圖已上傳,滾動的時候就像是滾動love you一樣滾動
以前一位老哥寫的程序,但我有點小白沒看懂,主要是一些語法沒學比如static,按位轉換等。可否求一個簡單的程序或者可以解釋詳細一點,謝了
  • #include <reg51.h>
  • #include <intrins.h>
  • #define uchar unsigned char
  • #define uint unsigned int
  • #define ulong unsigned long
  • sbit PinLE_Data = P2 ^ 6;
  • sbit PinLE_Comm = P2 ^ 7;
  • uchar code ucTabNumber[16] = {
  •   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  •   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  • };
  • // @12.000MHz
  • void Delay2ms(void) {
  •   uchar i, j;
  •   i = 4;
  •   j = 225;
  •   do
  •   {
  •     while (--j);
  •   } while (--i);
  • }
  • #define DISPALY_SPEED    60   // 決定顯示速度
  • #define SEG_LENGTH        6   // 數碼管位數
  • #define SET_74HC573(data, le)   {P0 = data; le = 1; _nop_(); le = 0;}
  • void Display(uchar *p_ucArr) {
  •   uchar i;
  •   uchar ucTemp;
  •   static uchar s_ucPosition;    // [0,11] 定位
  •   static uint s_uiCount;        // 計數
  •   for (i = 0; i < SEG_LENGTH; i++) {
  •     if ((s_ucPosition + i) < (SEG_LENGTH - 1)) {
  •       ucTemp = 0x00;
  •     } else if ((s_ucPosition + i) > ((SEG_LENGTH << 1) - 2)) {
  •       ucTemp = 0x00;
  •     } else {
  •       // 有效內容
  •       ucTemp = ucTabNumber[*(p_ucArr + ((s_ucPosition + i) - (SEG_LENGTH - 1)))], PinLE_Data;
  •     }
  •     SET_74HC573(0xff, PinLE_Comm);            // 先關閉公共端
  •     SET_74HC573(ucTemp, PinLE_Data);            // 賦值
  •     SET_74HC573(~(0x01 << i), PinLE_Comm);        // 打開公共端
  •     Delay2ms();   // 顯示
  •   }
  •   // 計數控制速度
  •   s_uiCount++;
  •   if(s_uiCount >= DISPALY_SPEED) {
  •     s_uiCount = 0;
  •     // 控制有效定位
  •     s_ucPosition++;
  •     if(s_ucPosition >= ((SEG_LENGTH << 1) - 1)) {
  •       s_ucPosition = 0;
  •     }
  •   }
  • }
  • /*
  • * 將數字按位轉換成數組
  • * ulNumber:原數字
  • * *p_ucArr:數組地址
  • */
  • void Transformation(ulong ulNumber, uchar *p_ucArr) {
  •   *p_ucArr = ulNumber / 100000;
  •   p_ucArr++;
  •   *p_ucArr = ulNumber % 100000 / 10000;
  •   p_ucArr++;
  •   *p_ucArr = ulNumber % 10000 / 1000;
  •   p_ucArr++;
  •   *p_ucArr = ulNumber % 1000 / 100;
  •   p_ucArr++;
  •   *p_ucArr = ulNumber % 100 / 10;
  •   p_ucArr++;
  •   *p_ucArr = ulNumber % 10;
  • }
  • void main(void) {
  •   uchar ucArr[6] = {0};
  •   ulong ulNumber = 187732;
  •   // 初始化數碼管-關閉顯示
  •   SET_74HC573(0xff, PinLE_Comm);
  •   SET_74HC573(0x00, PinLE_Data);
  •   // 將數字按位轉換成數組
  •   Transformation(ulNumber, ucArr);
  •   while (1) {
  •     // 顯示數組中的數字
  •     Display(ucArr);
  •   }
  • }



TX-1C型單片機開發板原理圖.pdf

1015.98 KB, 下載次數: 13

原理圖如下

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

來自 2#
ID:123289 發表于 2019-11-23 11:26 | 只看該作者
本帖最后由 yzwzfyz 于 2019-11-23 23:57 編輯

方案簡單:假設你的顯示屏只有N位(N=8),滾顯示N+X-1位(X=3,N+X=1位)。
1、做2N+X-1位一個顯示緩沖區(2N+X-1=18位)。放顯示的LED碼,注意N+X位之后要重頭重復放N-1位,如:1234567890A1234567)。
2、要點:不要將需要顯示的內容直接送屏,而是送入這個緩沖區。
3、顯示屏只從這個緩沖區中取8位進行顯示。
4、滾動的方式有兩種:
4.1、做個顯示屏指針P,讓P每間隔一個時間+1,并從1到N+X (1-11)之間變化,顯示屏以P為起點在緩沖區中取數字顯示。目的:無論P=?,你取到是總是電話號碼中的連續8個值在顯示,全每次后移了一位。
4.2、每間隔一個時間你讓緩沖區中的顯示碼前移一個字節,顯示屏總是取前N(8)個顯示碼顯示。
關鍵點:2N+X-1緩沖區!
做程序關鍵是方案,寫程序很容易,要明白道理。

評分

參與人數 1黑幣 +30 收起 理由
REwilliam + 30

查看全部評分

回復

使用道具 舉報

板凳
ID:96682 發表于 2019-11-22 06:39 來自手機 | 只看該作者
改程序
回復

使用道具 舉報

地板
ID:470332 發表于 2019-11-22 14:14 | 只看該作者
C語言不懂得地方就先學,學會了在看程序,“小白”不是接口,學習還是要靠自己
回復

使用道具 舉報

5#
ID:584814 發表于 2019-11-22 20:58 | 只看該作者
把love you和程序再加上you就夠11位了。
回復

使用道具 舉報

6#
ID:979469 發表于 2022-8-24 16:36 | 只看該作者
  1. #include <STC89C5xRC.H>
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit duan=P2^6;
  6. sbit wei=P2^7;
  7. uchar code tab[18]={0x06,0x6f,0x7f,0x06,0x06,0x06,0x6d,0x66,0x5b,0x06,0x5b,0x6f,0x00,0x00,0x00,0x00,0x00,0x00};
  8. //共陰極數碼管段碼表
  9. uchar idata dis_buf[6]={17,17,17,17,17,17};
  10. //顯示緩沖區數據(十進制)
  11. void delayms(uint i) //延時1ms函數
  12. {
  13.                 uint j;
  14.         for(;i>0;i--)
  15. for(j=120;j>0;j--)
  16. {;}
  17. }


  18. void main() //主函數
  19. {
  20.         uchar k,m,n,bitcode,segcode;
  21.         while(1)
  22.                 {
  23.                         for(n=0;n<17;n++)
  24.                         {
  25.                                 dis_buf[0]=dis_buf[1]; //數據移動
  26.                                 dis_buf[1]=dis_buf[2];
  27.                                 dis_buf[2]=dis_buf[3];
  28.                                 dis_buf[3]=dis_buf[4];
  29.                                 dis_buf[4]=dis_buf[5];
  30.                                 dis_buf[5]=n;
  31.                                 for(m=0;m<100;m++) //100次掃描,大約600ms
  32.                                 {
  33.                                         bitcode=0xfe; //起始位碼
  34.                                         for(k=0;k<6;k++)
  35.                                         {
  36.                                                 P0=0xff; //消影
  37.                                                 wei=1;
  38.                                                 wei=0;
  39.                                                 segcode=dis_buf[k]; //取數據
  40.                                                 P0=tab[segcode]; //送段碼
  41.                                                 duan=1;
  42.                                                 duan=0;
  43.                                                 P0=bitcode; //送位碼
  44.                                                 wei=1;
  45.                                                 wei=0;
  46.                                                 delayms(1);
  47.                                                 bitcode=_crol_(bitcode,1); //更新位碼,準備顯示下一位
  48.                                         }
  49.         }
  50.      }
  51.   }
  52. }
復制代碼
回復

使用道具 舉報

7#
ID:332444 發表于 2022-8-25 08:00 | 只看該作者

回復

使用道具 舉報

8#
ID:824490 發表于 2022-8-25 10:40 | 只看該作者
畫個流程圖就能解決問題了,為什么不動手畫一個呢?
回復

使用道具 舉報

9#
ID:799053 發表于 2022-8-29 08:25 | 只看該作者
用指針的方式就解決了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩黄色一级片 | 久久av一区二区 | 欧美黄色一区 | 蜜桃av一区二区三区 | 青青草视频网站 | 亚州成人 | 日日干日日操 | 成人在线视频免费观看 | 久久一 | 狠狠干影院 | 欧美老妇交乱视频 | 不卡视频在线 | 欧美日韩视频在线播放 | 日韩精品一区二区三区久久 | 中文字幕99 | 国产探花在线精品一区二区 | 国产96色在线 | 999热视频 | 久久激情视频 | 日韩在线播放第一页 | 天天看天天爽 | 亚洲精品视频免费观看 | 亚洲精品欧美一区二区三区 | 国产精品高潮呻吟久久 | 在线免费毛片 | 色综合久久88色综合天天 | 九九综合 | 欧美一级在线观看 | 亚洲精品中文在线观看 | 一区二区三区在线 | 中文字幕乱码一区二区三区 | 中文字幕日韩一区 | 欧美激情精品久久久久 | 亚洲精品综合 | 欧美日韩专区 | 精品一区二区三区在线视频 | 中文字幕一区二区三区四区 | www.中文字幕 | 亚洲人成人一区二区在线观看 | 九色视频网站 | 国产精品一区二区三区久久 |